如何将访问密钥和秘密密钥 shell 变量传递给 Redshift 复制命令

Posted

技术标签:

【中文标题】如何将访问密钥和秘密密钥 shell 变量传递给 Redshift 复制命令【英文标题】:How to Pass Access key and Secret Key shell variables to Redshift Copy Command 【发布时间】:2017-02-01 14:29:20 【问题描述】:

我正在尝试通过 SQL 脚本使用 Redshift Copy 命令,为此我需要通过 shell 变量传递访问密钥和秘密密钥。但由于 Redshift Copy Command 的格式,我无法传递 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;

复制命令的格式不正确。 有没有其他解决办法?

【问题讨论】:

【参考方案1】:

亚马逊提供了非常好的文档。 我通过谷歌搜索找到了您要查找的内容:'Redshift shell copy'

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

https://aws.amazon.com/articles/1143507459230804

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

#!/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=XXXX \' 并完全使用 $COPY_CREDENTIAL_PREFIX 但我试图避免这种方法 如果您使用带有两个文件输入的 Java,为什么不使用模板引擎而不是 shell 替换?

以上是关于如何将访问密钥和秘密密钥 shell 变量传递给 Redshift 复制命令的主要内容,如果未能解决你的问题,请参考以下文章

如何将Azure管道变量传递给AzureResourceManagerTemplateDeployment @ 3任务使用的ARM模板?

如何使用 API 密钥和秘密保护 Spring Boot API

如何使用 process.env 将环境变量中的 API 密钥传递给 Ember CLI?

如何创建新的亚马逊AWS访问密钥

使用boto3,从整个文件夹或文件从一个s3存储桶复制到同一区域的另一个文件夹时,如何提供访问密钥和秘密访问密钥?

我们可以使用复制命令使用访问密钥和秘密密钥将数据从 S3 加载到红移表中吗(不使用 IAM 角色)