【问题标题】:Lambda "Access Denied" when uploading to S3上传到 S3 时 Lambda“拒绝访问”
【发布时间】:2019-12-17 23:12:48
【问题描述】:

我一直在与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 的信息?如何绕过此“拒绝访问”消息?

【问题讨论】:

  • kms:GenerateDataKey 操作添加权限。

标签: amazon-web-services amazon-s3 serverless-framework


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    试试这个:

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

    如果这有效,您就知道您错过了一些操作。找到那个缺失的动作是一个痛苦的过程,或者如果你高兴,就把 *s 留在里面。

    【讨论】:

      猜你喜欢
      • 2013-10-25
      • 2019-06-03
      • 2020-09-30
      • 2019-09-18
      • 2020-03-06
      • 1970-01-01
      • 1970-01-01
      • 2018-05-21
      • 1970-01-01
      相关资源
      最近更新 更多