设置IAM角色以在AWS Lambda中运行AWS CLI Python子流程



我创建了一个包含AWS CLI的Lambda层,因为aws sync命令在boto3中不可用,并且复制功能太慢,无法在达到最大Lambda超时之前完成s3到s3的传输。

我可以运行AWS CLI命令(ls、sync等(作为Lambda的执行角色。我需要从Lambda运行aws sync来同步两个s3存储桶,作为一个可以访问源和目标存储桶的不同IAM用户

如何将CLI配置为以特定用户身份运行

下面的命令在本地成功地配置了用户,但当使用Lambda中的子流程函数运行时,获取调用者身份的输出仍然是Lambda角色的ARN。

/opt/aws configure set aws_access_key_id <id>
/opt/aws configure set aws_secret_access_key <key>
/opt/aws sts get-caller-identity

为了运行configure set id和key命令,我必须设置一个环境变量,以绕过只读Lambda文件系统,将凭据写入/temp目录。

环境变量:

key: HOME
value: /tmp

注意:有一个填充的凭据文件写入:/temp/.aws/credentials

λ:

import logging
import subprocess
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def run_command(command):
command_list = command.split(' ')
try:
logger.info("Running shell command: "{}"".format(command))
result = subprocess.run(command_list, stdout=subprocess.PIPE);
logger.info("Command output:n---n{}n---".format(result.stdout.decode('UTF-8')))
except Exception as e:
logger.error("Exception: {}".format(e))
return False
return True
def lambda_handler(event, context):
run_command('/opt/aws configure set aws_access_key_id <id>')
run_command('/opt/aws configure set aws_secret_access_key <key>')
# not set to new IAM user
run_command('/opt/aws sts get-caller-identity')

感谢阅读!

将IAM访问凭据作为环境变量传递给子流程,而不是尝试运行aws configure:

result = subprocess.run(command_list, stdout=subprocess.PIPE, env={
'AWS_ACCESS_KEY_ID': <id>,
'AWS_SECRET_ACCESS_KEY': <id>,
});

解释:

Lambda运行时环境为其使用的角色设置了环境变量,此处对此进行了说明,并且这些环境变量优先于您试图通过aws configure命令执行的任何操作。因此,解决此问题的最简单方法是覆盖通过env参数传递给子流程的环境变量。

我认为您对aws configure的调用无论如何都不起作用,因为所做的只是写入~/.aws/credentials文件,而该文件在AWS Lambda环境中是不可写的,只有/tmp是可写的。

相关内容

  • 没有找到相关文章

最新更新