尝试让我的 lambda putObject 通过无服务器访问现有 S3 存储桶

Joo*_*uur 4 amazon-s3 amazon-web-services aws-lambda serverless-framework

使用无服务器框架时,我在尝试为 lambda 的 S3 存储桶分配权限时遇到困难。

我有一个 lamba 函数,最终将 JSON 配置文件写入 S3 存储桶,我希望通过网络将其提供给应用程序。我最初单独设置了一个 S3 存储桶(不在 中serverless.yml),并且我的amba成功地在正确的 S3 存储桶中创建了文件,但当我将其部署到 AWS 时,出现“内部服务器错误”。我认为这是因为部署时设置的权限未授予它对存储桶的写入权限。

我有点不同意如何做到这一点。我已阅读此主题,例如,并尝试用serverless.yml以下内容补充我的内容:

provider:
  name: aws
  runtime: nodejs8.10
  stage: dev
  region: eu-west-1
  iamRoleStatements:
    - Effect: "Allow"
      Action:
        - "s3:PutObject"
      Resource:
        Fn::Join:
          - ""
          - - "arn:aws:s3:::"
            - Ref: arn:aws:s3:::com.joostschuur.quizdata
Run Code Online (Sandbox Code Playgroud)

在本例中,arn:aws:s3:::com.joostschuur.quizdata是我设置的手动创建的 S3 存储桶,并且希望我部署的 lambda 具有写入权限。但是,这会导致部署错误:

CloudFormation 模板无效:模板格式错误:模板的资源块中未解析的资源依赖项 [arn:aws:s3:::com.joostschuur.quizdata]

如果有一种方法可以将所有 S3 设置放入 serverless.yml 中(即指定存储桶,指定其中的文件应可通过网络访问等),我也很乐意这样做。

建议?

小智 6

在iamRoleStatements规范中有错误,应该是:

 iamRoleStatements:
    - Effect: "Allow"
      Action:
        - "s3:PutObject"
      Resource: arn:aws:s3:::com.joostschuur.quizdata/*
Run Code Online (Sandbox Code Playgroud)

或者

 iamRoleStatements:
    - Effect: "Allow"
      Action:
        - "s3:PutObject"
      Resource:
        Fn::Join:
          - ":"
          - - "arn:aws:s3::"
            - "com.joostschuur.quizdata/*"
Run Code Online (Sandbox Code Playgroud)

这个错误:

The CloudFormation template is invalid: Template format error: Unresolved resource dependencies [arn:aws:s3:::com.joostschuur.quizdata] in the Resources block of the template
Run Code Online (Sandbox Code Playgroud)

与以下内容有关:

    - Ref: arn:aws:s3:::com.joostschuur.quizdata
Run Code Online (Sandbox Code Playgroud)

因为这不是对参数或变量的引用。

享受!