上传到S3时Lambda“访问被拒绝”

问题描述 投票:1回答:2

我一直在使用Serverless (the framework),但遇到了一个问题。这可能取决于我对AWS的最低程度的了解以及它的架构,但也许有人可以为我指明正确的方向。

我已经使用Terraform创建了一个S3存储桶,它利用AWS的KMS为存储桶提供了服务器端加密。从CLI上载到此存储桶效果很好,但是当使用由无服务器创建的Lambda时,它将返回并显示“访问被拒绝”。

无服务器的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使用现有存储桶,有很多信息?如何解决此“访问被拒绝”消息?

amazon-web-services amazon-s3 serverless-framework
2个回答
0
投票

尝试一下:

  iamRoleStatements:
    - Effect: Allow
      Action:
        - s3:*
      Resource: "arn:aws:s3:::${self:custom.bucket.name}/*"
    - Effect: Allow
      Action:
        - kms:*
      Resource: "[KEY GOES HERE]"

如果可行,您知道您缺少一些操作。然后,这是一个痛苦的过程,需要寻找丢失的动作,或者,如果您感到高兴,只需留下* s。


0
投票

正如评论中的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

© www.soinside.com 2019 - 2024. All rights reserved.