如何在.yaml中为python lambda编写策略,以便使用aws sam cli从S3读取

如何在.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

我正在尝试将python lambda部署到aws。当给定一个bucket名称和文件路径时,这个lambda只从s3 bucket读取文件。如果我运行以下命令,它将在本地计算机上正常工作:

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无效