在 AWS Lambda 中将 IAM 角色设置为 运行 AWS CLI Python 子进程
Set IAM role to run AWS CLI Python subprocess in AWS Lambda
我创建了一个包含 AWS CLI 的 Lambda 层,因为 aws sync
命令在 boto3 中不可用,并且复制功能太慢,无法在达到最大 Lambda 超时之前完成 s3 到 s3 的传输.
我可以 运行 AWS CLI 命令(ls、sync 等)作为 Lambda 的执行角色。我需要从 Lambda 运行 aws sync
同步两个 s3 存储桶 作为一个不同的 IAM 用户 可以访问源和目标存储桶。
如何将 CLI 配置为 运行 作为特定用户?
下面的命令在本地成功配置了用户,但是当运行在Lambda中使用subprocess函数时,get-caller-identity的输出仍然是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 访问凭据作为 environment variables 传递给子进程,而不是尝试 运行 aws configure
:
result = subprocess.run(command_list, stdout=subprocess.PIPE, env={
'AWS_ACCESS_KEY_ID': <id>,
'AWS_SECRET_ACCESS_KEY': <id>,
});
解释:
Lambda 运行time 环境为其使用的角色设置了环境变量,documented here, and those environment variables are taking precedence 超过了您通过 aws configure
命令尝试执行的任何操作。因此,最简单的解决方法是覆盖通过 env
参数传递给子进程的环境变量。
我认为您对 aws configure
的调用无论如何都不起作用,因为所做的只是写入 ~/.aws/credentials
文件,而该文件在 AWS Lambda 环境中不可写,只有 /tmp
是可写的。
我创建了一个包含 AWS CLI 的 Lambda 层,因为 aws sync
命令在 boto3 中不可用,并且复制功能太慢,无法在达到最大 Lambda 超时之前完成 s3 到 s3 的传输.
我可以 运行 AWS CLI 命令(ls、sync 等)作为 Lambda 的执行角色。我需要从 Lambda 运行 aws sync
同步两个 s3 存储桶 作为一个不同的 IAM 用户 可以访问源和目标存储桶。
如何将 CLI 配置为 运行 作为特定用户?
下面的命令在本地成功配置了用户,但是当运行在Lambda中使用subprocess函数时,get-caller-identity的输出仍然是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 访问凭据作为 environment variables 传递给子进程,而不是尝试 运行 aws configure
:
result = subprocess.run(command_list, stdout=subprocess.PIPE, env={
'AWS_ACCESS_KEY_ID': <id>,
'AWS_SECRET_ACCESS_KEY': <id>,
});
解释:
Lambda 运行time 环境为其使用的角色设置了环境变量,documented here, and those environment variables are taking precedence 超过了您通过 aws configure
命令尝试执行的任何操作。因此,最简单的解决方法是覆盖通过 env
参数传递给子进程的环境变量。
我认为您对 aws configure
的调用无论如何都不起作用,因为所做的只是写入 ~/.aws/credentials
文件,而该文件在 AWS Lambda 环境中不可写,只有 /tmp
是可写的。