在 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 是可写的。