Postgresql 如何将Access key和Secret key外壳变量传递给Redshift Copy命令

Postgresql 如何将Access key和Secret key外壳变量传递给Redshift Copy命令,postgresql,shell,amazon-s3,amazon-redshift,Postgresql,Shell,Amazon S3,Amazon Redshift,我试图通过SQL脚本使用Redshift Copy命令,为此我需要通过shell变量传递访问密钥和密钥。但是由于Redshift Copy命令的格式,我无法传递shell变量 COPY ${REDSHIFT_SCHEMA_NAME}.${REDSHIFT_TABLE_NAME} FROM ${S3_SOURCE} credentials 'aws_access_key_id=${AWS_ACCESS_KEY_ID};aws_secret_access_key=${AWS_SECRET_ACC

我试图通过SQL脚本使用Redshift Copy命令,为此我需要通过shell变量传递访问密钥和密钥。但是由于Redshift Copy命令的格式,我无法传递shell变量

COPY ${REDSHIFT_SCHEMA_NAME}.${REDSHIFT_TABLE_NAME} FROM  ${S3_SOURCE}  credentials 'aws_access_key_id=${AWS_ACCESS_KEY_ID};aws_secret_access_key=${AWS_SECRET_ACCESS_KEY}'  delimiter '${DELIMITER}' COMPUPDATE OFF STATUPDATE OFF;
我面临的问题是AWS_SECRET_ACCESS_KEY和AWS_ACCESS_KEY_ID无法解决,因为它们都在一个引号中

关于将命令用作

 COPY ${REDSHIFT_SCHEMA_NAME}.${REDSHIFT_TABLE_NAME_BACKLOG} FROM  ${S3_SOURCE}  credentials aws_access_key_id='${AWS_ACCESS_KEY_ID}';aws_secret_access_key='${AWS_SECRET_ACCESS_KEY}'  delimiter '${DELIMITER}' COMPUPDATE OFF STATUPDATE OFF;
复制命令的格式不正确。
还有其他解决方案吗?

亚马逊提供了非常好的文档。 我通过谷歌搜索找到了你想要的:“红移shell副本”

下面是一篇带有工作shell脚本的文章:

我用过这个,它对我有用:

#!/bin/bash
set -eu

AWS_ACCESS_KEY_ID='my_access_key'
AWS_SECRET_ACCESS_KEY='my_secret_access_key'

REDSHIFT_SCHEMA_NAME='redshift_schema_name'
REDSHIFT_TABLE_NAME_BACKLOG='redshift_table_name_backlog'
S3_SOURCE='s3_source'
DELIMITER='delimiter'

cmd="COPY ${REDSHIFT_SCHEMA_NAME}.${REDSHIFT_TABLE_NAME_BACKLOG} FROM ${S3_SOURCE}  credentials aws_access_key_id='${AWS_ACCESS_KEY_ID}';aws_secret_access_key='${AWS_SECRET_ACCESS_KEY}' delimiter '${DELIMITER}' COMPUPDATE OFF STATUPDATE OFF;"
echo $cmd

我正在寻找的是将shell变量替换到脚本文件中,这些变量不在脚本文件中解析,而在Bash上直接使用它们解析。您可以提供整个shell脚本吗?我有java代码,它将属性文件作为输入,脚本文件作为输入,并执行sql查询。我可以通过属性文件传递变量。由sql脚本文件访问,并作为'aws_access_key_id=${aws_access_key_id};aws_secret_access_key=${aws_secret_access_key}在单引号中无法从属性文件解析变量一种方法可以是COPY_CREDENTIAL_PREFIX=\'aws_access_key_id=XXXXX';“aws_secret_access_key=XXXXX\”并使用${COPY_CREDENTIAL_PREFIX}总之,我试图避免这种方法。如果您使用带有两个文件输入的Java,为什么不使用模板引擎而不是shell替换呢?