【问题标题】:How to use output artifact of CodeBuild in CloudFormation?如何在 CloudFormation 中使用 CodeBuild 的输出工件?
【发布时间】:2023-03-15 06:25:01
【问题描述】:

因此,我尝试设置一个相当简单的堆栈,其中包含一个订阅 SNS 主题的 Lambda 函数。我想使用具有三个阶段的 CodePipeline:Source (GitHub) -> Build (CodeBuild) -> Deploy (CloudFormation)。

我设法拼凑了一个可以工作的模板和构建规范文件,但我不知道应该如何引用 CodeBuild 在 CloudFormation 模板中创建的输出工件;现在我只有占位符内联代码。

基本上,我应该在 Lambda 函数的 Code: 属性中添加什么以获取 CodeBuild 文件(这是我在 CodePipeline 中的输出工件)?

模板.yml:

AWSTemplateFormatVersion: 2010-09-09
Resources:
  SNSTopic:
    Type: 'AWS::SNS::Topic'
    Properties:
      Subscription:
        - Endpoint: !GetAtt
            - LambdaFunction
            - Arn
          Protocol: lambda
  LambdaFunction:
    Type: 'AWS::Lambda::Function'
    Properties:
      Runtime: python3.6
      Handler: main.lamda_handler
      Timeout: '10'
      Role: !GetAtt
        - LambdaExecutionRole
        - Arn
      Code:
        ZipFile: >
          def lambda_handler(event, context):
            print(event)
            return 'Hello, world!'
  LambdaExecutionRole:
    Type: 'AWS::IAM::Role'
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - lambda.amazonaws.com
            Action:
              - 'sts:AssumeRole'
      ManagedPolicyArns:
        - 'arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole'
  LambdaInvokePermission:
    Type: 'AWS::Lambda::Permission'
    Properties:
      FunctionName: !GetAtt
        - LambdaFunction
        - Arn
      Action: 'lambda:InvokeFunction'
      Principal: sns.amazonaws.com
      SourceArn: !Ref SNSTopic

buildspec.yml:

version: 0.2
phases:
  install:
    commands:
      - pip install -r requirements.txt -t libs
artifacts:
  type: zip
  files:
    - template.yml
    - main.py
    - lib/*

【问题讨论】:

  • 我在您的 CloudFormation 模板中缺少您的 AWS::CodePipeline::PipelineAWS::CodeBuild::Project 资源。
  • 我没有用 CloudFormation 控制它们;还在学习 CF,所以尝试开始很简单。

标签: amazon-web-services aws-codepipeline aws-codebuild amazon-cloudformation


【解决方案1】:

感谢 AWS 的支持,终于找到了解决方案。首先,我将此 JSON 放在 CodePipeline 中 CloudFormation 部署步骤中的 Parameter Overrides 中:

{
  "buildBucketName" : { "Fn::GetArtifactAtt" : ["MyAppBuild", "BucketName"]},
  "buildObjectKey" : { "Fn::GetArtifactAtt" : ["MyAppBuild", "ObjectKey"]}
}

然后像这样更改我的 CF 模板:

AWSTemplateFormatVersion: 2010-09-09
Parameters:
  buildBucketName:
    Type: String
  buildObjectKey:
    Type: String

  Resources:
    ...
    LambdaFunction:
        ...
        Code:
            S3Bucket: !Ref buildBucketName
            S3Key: !Ref buildObjectKey

这会将 CodeBuild 输出的输出工件存储桶名称和对象键作为参数传递给 CF,这样它就可以在 S3 中动态获取输出工件位置,而无需进行任何硬编码,从而使模板更加便携。

【讨论】:

    【解决方案2】:

    您的 CodeBuild 应该将您的 zip 文件放到 S3 存储桶中。因此,在您的 LambdaFunction 资源的代码部分中,您指向它。

    Code:
       S3Bucket: the_bucket_where_CodeBuild_dropped_your_zip
       S3Key: the_name_of_the_zip_file_dropped
    

    你不需要'ZipFile:'

    【讨论】:

    • 这是一种方法,但我的目标是避免“手动”指定任何值(即硬编码我的 Lambda 部署包的位置)。最终以不同的方式解决它。
    【解决方案3】:

    我知道这个问题很老了,但我想我会针对 SAM 回答这个问题

    project_root/
      template.yaml
      buildspec.yaml
      my_lambda/
        my_lambda.py
        requirements.txt
    

    模板.yaml:

    Transform: AWS::Serverless-2016-10-31
    
    Resources:
      MyLambda:
        Type: AWS::Serverless::Function
        Properties:
          Handler: my_lambda.lambda_handler
          CodeUri: my_lambda/
          Runtime: python3.8
    

    buildspec.yaml:

    version: 0.2
    
    phases:
      install:
        runtime-versions:
          python: 3.8
        commands:
          - pip install aws-sam-cli
      build:
        commands:
          - sam build
          - sam package --s3-bucket mybucket --s3-prefix sam | sam deploy -t /dev/stdin --stack-name FOOSTACK --capabilities CAPABILITY_IAM
    

    注意事项:

    1. sam buildpip install 你的 lambda requirements.txt
    2. sam package 将压缩您的 lambda,并使用其内容的 md5 命名并为您上传到 S3(仅当它已更改时)
    3. sam deploy 将创建一个 CloudFormation 变更集并为您运行它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-01
      • 1970-01-01
      相关资源
      最近更新 更多