我创建了一个包含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
是可写的。