【发布时间】:2019-11-19 00:51:02
【问题描述】:
我正在尝试将 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-sam\build\template.yaml --output-template-file packaged.yaml
下一步是在 prod 中部署,所以我尝试以下命令:
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 文件中添加一个策略。此链接here 似乎说我应该添加一个策略,例如显示here 的策略。所以,我补充说:
Policies: S3CrudPolicy
在“Resources:GetFileFromBucketFunction:Properties:”下,然后我重新构建应用程序并重新部署,但部署失败并在 cloudformation 中出现以下错误:
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”不是我可以使用的现成策略,而是我必须在 template.yaml 文件中定义自己的策略?
我不确定如何执行此操作,并且文档似乎没有显示任何非常简单的用例示例(据我所知),如果有人知道如何执行此操作,您可以发布解决方案吗?
我尝试了以下方法:
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 amazon-cloudformation aws-sam-cli aws-sam