上传到 S3 时的 Lambda "Access Denied"
Lambda "Access Denied" when uploading to S3
我一直在使用 Serverless (the framework),但遇到了一个问题。这可能是因为我对 AWS 及其架构知之甚少,但也许有人可以为我指明正确的方向。
我已经使用 Terraform 创建了一个 S3 存储桶,它利用 AWS 的 KMS 为存储桶提供服务器端加密。从 CLI 上传到这个存储桶工作正常,但是当使用无服务器创建的 Lambda 时,它 returns 和 "Access Denied".
无服务器 yaml 具有上传到 S3 的权限,我已经在关闭 SSE 的情况下对其进行了测试,它工作正常。
我不明白的是如何为AWS指定密钥。我认为将它添加到服务顶部可能会起作用(但无济于事)。
这是 yaml 文件:
service:
name: lambdas
awsKmsKeyArn: [KEY GOES HERE]
custom:
serverless-offline:
port: 3000
bucket:
name: evidence-bucket
serverSideEncryption: aws:kms
sseKMSKeyId: [ KEY GOES HERE]
provider:
name: aws
runtime: nodejs12.x
region: eu-west-2
iamRoleStatements:
- Effect: Allow
Action:
- s3:ListBucket
- s3:PutObject
- s3:PutObjectAcl
Resource: "arn:aws:s3:::${self:custom.bucket.name}/*"
- Effect: Allow
Action:
- kms:Encrypt
- kms:Decrypt
- kms:DescribeKey
Resource: "[KEY GOES HERE]"
functions:
storeEvidence:
handler: handler.storeEvidence
environment:
BUCKET: ${self:custom.bucket.name}
events:
- http:
path: store-evidence
method: post
我需要额外的插件吗?有很多关于使用无服务器创建存储桶的信息,但没有关于将现有存储桶与 SSE 一起使用的信息?我如何绕过此 "Access Denied" 消息?
试试这个:
iamRoleStatements:
- Effect: Allow
Action:
- s3:*
Resource: "arn:aws:s3:::${self:custom.bucket.name}/*"
- Effect: Allow
Action:
- kms:*
Resource: "[KEY GOES HERE]"
如果这有效,您就知道您错过了一些操作。这是一个寻找缺失动作的痛苦过程,或者如果你高兴,就把 * 留在里面。
正如评论中的 jarmod 所说,您缺少 kms:GenerateDataKey。在这里,我将向您展示确切需要添加到上面所示的现有 yaml 中的内容:
# ...
provider:
name: aws
runtime: nodejs12.x
region: eu-west-2
iamRoleStatements:
- Effect: Allow
Action:
- s3:ListBucket
- s3:PutObject
- s3:PutObjectAcl
Resource: "arn:aws:s3:::${self:custom.bucket.name}/*"
- Effect: Allow
Action:
- kms:Encrypt
- kms:Decrypt
- kms:DescribeKey
- kms:GenerateDataKey # <------ this is the new permission
Resource: "[KEY GOES HERE]"
#...
而且值得注意的是,如果你的代码字面上只是使用s3:PutObject上传,你不需要添加Encrypt,DescribeKey权限。参见:https://aws.amazon.com/premiumsupport/knowledge-center/s3-access-denied-error-kms/
如果您的代码涉及分段上传,您确实需要 kms:DescribeKey、kms:Encrypt 和更多权限(如 kms:ReEncrypt*、kms:GenerateDataKey*...)查看详细信息: https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuAndPermissions.html
我一直在使用 Serverless (the framework),但遇到了一个问题。这可能是因为我对 AWS 及其架构知之甚少,但也许有人可以为我指明正确的方向。
我已经使用 Terraform 创建了一个 S3 存储桶,它利用 AWS 的 KMS 为存储桶提供服务器端加密。从 CLI 上传到这个存储桶工作正常,但是当使用无服务器创建的 Lambda 时,它 returns 和 "Access Denied".
无服务器 yaml 具有上传到 S3 的权限,我已经在关闭 SSE 的情况下对其进行了测试,它工作正常。
我不明白的是如何为AWS指定密钥。我认为将它添加到服务顶部可能会起作用(但无济于事)。
这是 yaml 文件:
service:
name: lambdas
awsKmsKeyArn: [KEY GOES HERE]
custom:
serverless-offline:
port: 3000
bucket:
name: evidence-bucket
serverSideEncryption: aws:kms
sseKMSKeyId: [ KEY GOES HERE]
provider:
name: aws
runtime: nodejs12.x
region: eu-west-2
iamRoleStatements:
- Effect: Allow
Action:
- s3:ListBucket
- s3:PutObject
- s3:PutObjectAcl
Resource: "arn:aws:s3:::${self:custom.bucket.name}/*"
- Effect: Allow
Action:
- kms:Encrypt
- kms:Decrypt
- kms:DescribeKey
Resource: "[KEY GOES HERE]"
functions:
storeEvidence:
handler: handler.storeEvidence
environment:
BUCKET: ${self:custom.bucket.name}
events:
- http:
path: store-evidence
method: post
我需要额外的插件吗?有很多关于使用无服务器创建存储桶的信息,但没有关于将现有存储桶与 SSE 一起使用的信息?我如何绕过此 "Access Denied" 消息?
试试这个:
iamRoleStatements:
- Effect: Allow
Action:
- s3:*
Resource: "arn:aws:s3:::${self:custom.bucket.name}/*"
- Effect: Allow
Action:
- kms:*
Resource: "[KEY GOES HERE]"
如果这有效,您就知道您错过了一些操作。这是一个寻找缺失动作的痛苦过程,或者如果你高兴,就把 * 留在里面。
正如评论中的 jarmod 所说,您缺少 kms:GenerateDataKey。在这里,我将向您展示确切需要添加到上面所示的现有 yaml 中的内容:
# ...
provider:
name: aws
runtime: nodejs12.x
region: eu-west-2
iamRoleStatements:
- Effect: Allow
Action:
- s3:ListBucket
- s3:PutObject
- s3:PutObjectAcl
Resource: "arn:aws:s3:::${self:custom.bucket.name}/*"
- Effect: Allow
Action:
- kms:Encrypt
- kms:Decrypt
- kms:DescribeKey
- kms:GenerateDataKey # <------ this is the new permission
Resource: "[KEY GOES HERE]"
#...
而且值得注意的是,如果你的代码字面上只是使用s3:PutObject上传,你不需要添加Encrypt,DescribeKey权限。参见:https://aws.amazon.com/premiumsupport/knowledge-center/s3-access-denied-error-kms/
如果您的代码涉及分段上传,您确实需要 kms:DescribeKey、kms:Encrypt 和更多权限(如 kms:ReEncrypt*、kms:GenerateDataKey*...)查看详细信息: https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuAndPermissions.html