我们正在使用 CloudFormation SAM 模板部署 lambda。
我们希望将 lambda 打包到 S3 存储桶中,然后在多个区域部署 AWS::Serverless::Function。
但是,lambda 代码必须位于与其部署位置相同的区域。
AWS 已记录如何解决此问题,本质上是通过创建另一个 lambdaCopyZips
将 zip 文件复制到要部署的每个区域,并LambdaZipsBucket
在每个区域中创建一个新的 s3 存储桶来放置它。然后您的 lambda 函数如下所示:
MyFunction:
DependsOn: CopyZips
Type: AWS::Lambda::Function
Properties:
Code:
S3Bucket: !Ref 'LambdaZipsBucket'
S3Key: !Sub '${QSS3KeyPrefix}functions/packages/MyFunction/lambda.zip'
问题是,这依赖于知道 zip 文件的确切路径。在我们的例子中,我们使用 SAM 模板替换,因此我们从不指定 S3 存储桶或 S3 密钥 - 相反,我们的函数如下所示:
MyFunction:
Type: 'AWS::Serverless::Function'
Properties:
CodeUri: ./MyCompany.Service.Broker.Public
CloudFormation 模板中根本没有引用 S3 存储桶。您可以通过浏览存储桶来查看 lambda,其名称如下:
ApiFunction-CodeUri-2342873t823t482346-97346583746583745.zip
这是因为在构建时创建了许多类似的 zip 文件。无服务器模板模型将对此进行解码,如果我们查看 CloudFormation 控制台中的模板选项卡并选择“查看已处理的模板”,我们可以看到 S3Bucket 和 S3Key 字段已正确填充。
构建是在 Azure devops 中完成的,使用AmazonWebServices.aws-vsts-tools.LambdaNETCoreDeploy.LambdaNETCoreDeploy@1
任务,我们在其中指定存储桶名称和区域,但同样,没有指定 zip 文件的名称。
鉴于我无法在模板中访问 lambda zip 文件的确切路径,我该如何自动将 zip 文件复制到本地存储桶?
更新:
我尝试在属性中的 CodeUri 之前添加以下行:
Code:
S3Bucket: !Ref 'LambdaZipsBucket'
但是我在部署时收到以下错误:
Resource with id [ApiFunction] is invalid. property Code not defined for resource of type AWS::Serverless::Function
答案1
您可以尝试将策略与 AWS::Serverless::Function 结合使用并授予相关权限。格式看起来允许。
Policies:
- AWSLambdaExecute
- Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- s3:GetObject
- s3:GetObjectACL
Resource: 'arn:aws:s3:::LambdaZipsBucket/*'