繁体   English   中英

AWS Lambda S3 访问被拒绝

[英]AWS Lambda S3 Access Denied

我有一个 lambda function 使用具有以下策略摘录的角色

{
            "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。 但是当我的 function 运行时

s3_obj = s3_res.Object(s3_bucket, s3_object)

我明白了

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

我还必须添加哪些权限? object 就在那里,当我使用管理员角色在本地运行代码时可以得到它。

更新

我已经检查了数十次以确保存储桶和 object 名称正确无误。 根据堆栈跟踪,异常实际上来自这里的第二行

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

KMS 应该只是 PutObject 的一个因素。 我们有一个支持帐户,因此我可以与他们核实并更新他们的发现。

要从 S3 下载 KMS 加密的 object,您不仅需要能够获得 object。您还需要能够解密 AWS KMS 密钥。

以下是您的 Lambda function 应具有的 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": "*"
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM