AWS Lambda S3访问被拒绝。

5

我有一个使用以下策略摘录的角色的Lambda函数:

{
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::ipwl-lambda-config/*",
                "arn:aws:s3:::ipwl-lambda-config"
            ]
        }

我的存储桶策略如下所示

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DenyUnEncryptedObjectUploads",
            "Effect": "Deny",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::ipwl-lambda-config/*",
            "Condition": {
                "StringNotEquals": {
                    "s3:x-amz-server-side-encryption": "aws:kms"
                }
            }
        },
        {
            "Sid": "AllowLambda",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::accountid:role/iam_for_lambda"
            },
            "Action": [
                "s3:ListBucket",
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::ipwl-lambda-config/*",
                "arn:aws:s3:::ipwl-lambda-config"
            ]
        }
    ]
}

我已经在角色和存储桶策略上允许了GetObject和ListBucket。然而,当我的函数运行时,执行以下代码:

s3_obj = s3_res.Object(s3_bucket, s3_object)

我遇到了如下错误:

[ERROR] ClientError: 在调用GetObject操作时发生错误(AccessDenied):拒绝访问

我需要添加哪些权限?该对象存在,当我使用管理员角色在本地运行代码时可以获取到它。

更新

我已经数十次检查了存储桶和对象名称是否正确。根据堆栈跟踪,实际上是来自这里的第二行代码引起了异常。

s3_res = boto3.resource('s3')
s3_obj = s3_res.Object(s3_bucket, s3_object)
data = s3_obj.get()['Body'].read()

KMS 仅适用于 PutObject。我们有一个支持帐户,所以我可以向他们查询并更新他们的发现。

我认为看起来不错。你能再确认一下Lambda函数使用的存储桶名称和IAM角色是否正确吗? - jellycsc
这个回答解决了你的问题吗?aws lambda函数从s3获取getObject时出现访问被拒绝的情况 - qedk
如果您在Lambda中已经拥有S3权限,则不需要使用bucket语句。除非涉及不同的账户,否则这是多余的。您在Lambda角色中的S3内联策略是正确的。您确定s3_res.Object抛出了错误吗?也许您有其他的S3操作?此外,我很好奇KMS如何适用于此。 - Marcin
1个回答

7
从S3下载一个KMS加密的对象,你不仅需要可以获取这个对象,还需要能够解密AWS KMS密钥。
以下是Lambda函数应具备的IAM策略示例:
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "s3get",
      "Effect": "Allow",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::ipwl-lambda-config/*"
    },
    {
      "Sid": "kmsdecrypt",
      "Effect": "Allow",
      "Action": "kms:Decrypt",
      "Resource": "arn:aws:kms:example-region-1:123456789012:key/example-key-id"
    }
  ]
}

关键策略还需要允许IAM角色解密密钥,类似这样的内容:
{
  "Sid": "kmsdecrypt",
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::123456789012:role/xyz"
  },
  "Action": "kms:Decrypt",
  "Resource": "*"
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接