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

标签 yaml aws-cloudformation aws-sam-cli aws-sam

我正在尝试将 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

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

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 读取/写入,那就太棒了?我需要编写另一个,以便让 lambda 也能调用其他 lambda,所以这里的解决方案(我想类似的东西?)会很棒吗? - 或者一个关于如何编写这些政策声明的体面且易于使用的指南?

非常感谢您的帮助!

最佳答案

找到了!!如果其他人遇到此问题,您需要将以下几行添加到 template.yaml 文件中的 Resources:YourFunction:Properties 中:

  Policies: 
    - S3CrudPolicy:
        BucketName: "*"

“*”将允许您的 lambda 与任何存储桶通信,如果需要,您可以切换为特定的内容。如果您省略“BucketName”,则它将不起作用,并在 CloudFormation 中返回错误,表明 S3CrudPolicy 无效。

关于yaml - 如何在 .yaml 中编写策略,以便 python lambda 使用 aws sam cli 从 S3 读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56952991/

相关文章:

java - SnakeYAML 转储嵌套键

azure-devops - 在 Azure Devops 中按顺序运行作业

aws-cloudformation - 使用jq替换云形成参数值

amazon-web-services - 如何从命令行将 lambda 代码下载/拉到本地机器?

yaml - 在 yaml-cpp 中保存节点引用

php - SF4 身份验证工作但未保存 token (从未调用序列化)

amazon-s3 - 无法通过 cfn-init 和 UserData 脚本使用 AWS CloudFormation 模板在 EC2 实例上部署应用程序

amazon-web-services - Cloudformation Cloudwatch 输入模板格式

amazon-web-services - 在本地运行 AWS SAM 项目出现错误

amazon-web-services - 如何在没有 Brew 的情况下在 Linux 上安装 AWS SAM CLI