如何在.yaml中为python lambda编写策略,以便使用aws sam cli从S3读取
我正在尝试将python lambda部署到aws。当给定一个bucket名称和文件路径时,这个lambda只从s3 bucket读取文件。如果我运行以下命令,它将在本地计算机上正常工作:如何在.yaml中为python lambda编写策略,以便使用aws sam cli从S3读取,yaml,amazon-cloudformation,aws-sam-cli,aws-sam,Yaml,Amazon Cloudformation,Aws Sam Cli,Aws Sam,我正在尝试将python lambda部署到aws。当给定一个bucket名称和文件路径时,这个lambda只从s3 bucket读取文件。如果我运行以下命令,它将在本地计算机上正常工作: sam build && sam local invoke --event testfile.json GetFileFromBucketFunction sam deploy --template-file packaged.yaml --stack-name getfilefrombuc
sam build && sam local invoke --event testfile.json GetFileFromBucketFunction
sam deploy --template-file packaged.yaml --stack-name getfilefrombucket --capabilities CAPABILITY_IAM --region my-region
文件中的数据将打印到控制台。接下来,如果我运行以下命令,lambda将被打包并发送到我的bucket
sam build && sam package --s3-bucket my-bucket --template-file .aws-sam\build\template.yaml --output-template-file packaged.yaml
下一步是在prod中部署,因此我尝试以下命令:
sam build && sam local invoke --event testfile.json GetFileFromBucketFunction
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
在“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
及
我删除堆栈以重新开始。我的想法是,‘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,所以这里的解决方案(我想类似的东西?)会很棒还是一本像样、易于使用的政策声明编写指南
非常感谢你的帮助 找到了!!如果其他人对此有困难,您需要在template.yaml文件中的参考资料中添加以下几行:YourFunction:Properties:
Policies:
- S3CrudPolicy:
BucketName: "*"
“*”将允许您的lambda与任何bucket对话,如果需要,您可以切换到特定的bucket。如果您省略了“BucketName”,那么它将不起作用,并在CloudFormation中返回一个错误,表示S3CrudPolicy无效