如何使用AWS Sam Cli在.YAML中编写一项策略以从S3读取



我试图将python lambda部署到AWS。当给出一个存储桶名称和文件路径时,此lambda只是从S3存储桶中读取文件。如果我运行以下命令:

在本地计算机上正常工作。
sam build && sam local invoke --event testfile.json GetFileFromBucketFunction

文件中的数据打印到控制台。接下来,如果我运行以下命令,则将lambda打包并发送到my-bucket。

sam build && sam package --s3-bucket my-bucket --template-file .aws-sambuildtemplate.yaml --output-template-file packaged.yaml

下一步是在产品中部署,因此我尝试以下命令:

sam deploy --template-file packaged.yaml --stack-name getfilefrombucket --capabilities CAPABILITY_IAM --region my-region

现在可以在lambda控制台中看到lambda,我可以运行它,但是没有返回内容,如果我手动将服务角色更改为允许s3 get/put的服务角色,则lambda可以使用。但是,这破坏了使用AWS SAM CLI的全部点。

我认为我需要在template.yaml文件中添加策略。这里的链接似乎说我应该添加一个策略,例如此处显示的策略。所以,我补充说:

Policies: S3CrudPolicy

在'资源下:getfilefile frombucketFunction:属性:',然后我重建应用程序和重新部署,而部署失败,云形式中的以下错误:

1 validation error detected: Value 'S3CrudPolicy' at 'policyArn' failed to satisfy constraint: Member must have length greater than or equal to 20 (Service: AmazonIdentityManagement; Status Code: 400; Error Code: ValidationError; Request ID: unique number

The following resource(s) failed to create: [GetFileFromBucketFunctionRole]. . Rollback requested by user.

我删除堆栈以重新开始。我的想法是," s3crudpolicy"不是我只能使用的货架政策,而是我必须在模板中定义自己的东西?

我不确定该怎么做,并且文档似乎没有显示任何非常简单的用例示例(从我可以看到的(,如果有人知道该怎么做,您可以发布解决方案吗?p>我尝试了以下内容:

S3CrudPolicy:
  PolicyDocument:
    -
      Action: "s3:GetObject"
      Effect:  Allow
      Resource: !Sub arn:aws:s3:::${cloudtrailBucket}
      Principal:  "*"

,但由于以下错误而失败:

Failed to create the changeset: Waiter ChangeSetCreateComplete failed: Waiter encountered a terminal failure state Status: FAILED. Reason: Invalid template property or properties [S3CrudPolicy] 

如果有人可以帮助编写简单的策略来从S3中读取/写作,那真是太神奇了吗?我需要再写另一本书,以便让Lambdas还调用其他Lambdas,所以这里的解决方案(我想类似的事情?(会很棒吗? - 或一个体面的,易于使用的指南如何编写这些策略语句?

非常感谢您的帮助!

找到了!如果其他人为此而努力,您需要将以下几行添加到资源:您的功能:模板中的属性.yaml文件:

  Policies: 
    - S3CrudPolicy:
        BucketName: "*"

"*"将允许您的lambda与任何水桶交谈,您可以在需要时切换一些特定的东西。如果您遗漏了" bucketname",则它不起作用,并且返回云形式中的错误,即S3Crudpolicy无效。

最新更新