无法从 S3 存储桶在多个区域部署相同的 Lambda

无法从 S3 存储桶在多个区域部署相同的 Lambda

我们正在使用 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/*'

相关内容