【问题标题】:aws_access_key_id in aws lambda environmentaws lambda 环境中的 aws_access_key_id
【发布时间】:2018-05-18 02:31:41
【问题描述】:

我正在使用 boto3 为 s3 创建一个预签名的帖子网址。

s3 = boto3.client('s3')
post = s3.generate_presigned_post(
        Bucket=bucket_name,
        Key=f"{userid}.{suffix}"
    )

正在使用的aws_access_key_id是错误的,正确的使用方法之一是通过环境变量添加环境变量。

知道如何使用我在 IAM 中创建的用户定义的 aws 访问密钥强制执行吗?

更新 1

附加到执行 lambda 的 IAM 角色的策略

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:*"
            ],
            "Resource": "arn:aws:logs:*:*:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "lambda:InvokeFunction"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "xray:PutTraceSegments",
                "xray:PutTelemetryRecords"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:AttachNetworkInterface",
                "ec2:CreateNetworkInterface",
                "ec2:DeleteNetworkInterface",
                "ec2:DescribeInstances",
                "ec2:DescribeNetworkInterfaces",
                "ec2:DetachNetworkInterface",
                "ec2:ModifyNetworkInterfaceAttribute",
                "ec2:ResetNetworkInterfaceAttribute"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "kinesis:*"
            ],
            "Resource": "arn:aws:kinesis:*:*:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "sns:*"
            ],
            "Resource": "arn:aws:sns:*:*:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "sqs:*"
            ],
            "Resource": "arn:aws:sqs:*:*:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:*"
            ],
            "Resource": "arn:aws:dynamodb:*:*:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "route53:*"
            ],
            "Resource": "*"
        }
    ]
}

更新 2

在 IAM 中的角色 Lambda 配置中的角色配置

【问题讨论】:

  • 正确的方法是将正确的 IAM 策略附加到 Lambda 的 IAM 角色。那么您不需要明确指定凭据。
  • @helloV 谢谢。我已附上政策,我错过了什么?
  • 角色凭据有一个以ASIA(不是AKIA)开头的访问密钥ID,并且它会轮换。 “我们的记录中不存在访问密钥”是如果请求缺少随附的 x-amz-security-token 所引发的错误,该 x-amz-security-token 为临时访问密钥 ID 赋予了意义。
  • @Michael-sqlbot 但我从哪里可以得到 x-amz-security-token ?我想把它作为响应的一部分取回吗?
  • 它应该自动在环境中为aws_session_token

标签: amazon-web-services amazon-s3 aws-lambda boto3 amazon-iam


【解决方案1】:

您不应将 IAM 用户用于 lambda 中的任何类型的执行权限。而是使用附加了适当策略和attach that role to your Lambda function 的 IAM 角色。

另请注意,一旦配置了角色,lambda 将自动将 access id 和 secret 设置为环境变量,Boto 将在无需任何额外配置的情况下检索它们。

【讨论】:

  • 我已附上保单,我还缺少什么?
  • @efi-mk,查看您的更新,该策略对 S3 有足够的权限,您可以分享执行中的任何堆栈跟踪吗?另外,lambda是如何部署的?在 VPC 中?如果是这样,是公共子网还是私有子网?
  • 我收到以下错误:我们的记录中不存在您提供的 AWS 访问密钥 ID。 我的 IAM 用户中不存在访问密钥。我正在使用 zappa 进行部署,它不是任何 VPC 的一部分
  • 您是明确设置访问密钥和密钥还是让 lambda 根据附加角色填充它们?此外,我在AWS Developer forumsGitHub 上看到了类似的问题,其中根本问题不是在使用基于角色的凭据时设置会话令牌。如果 lambda 正在设置凭据,我相信应该自动设置会话令牌。我经常在我的 python 脚本中使用“os.environ”来查看在运行时设置的所有环境变量
  • aws 密钥从何而来?我在系统中没有任何类似于该密钥的密钥。我有一个 iam 用户
猜你喜欢
  • 2017-12-17
  • 1970-01-01
  • 2017-08-01
  • 2016-10-27
  • 2021-05-09
  • 2018-07-15
  • 2022-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多