web-dev-qa-db-ja.com

CloudFormationでCodeBuildの出力アーティファクトを使用するにはどうすればよいですか?

そのため、SNSトピックにサブスクライブされた単一のLambda関数で構成される非常に単純なスタックをセットアップしようとしています。 CodePipelineを3つのステージで使用したいと思います:ソース(GitHub)->ビルド(CodeBuild)->デプロイ(CloudFormation)。

CodeBuildがCloudFormationテンプレートで作成する出力アーティファクトを参照する方法に迷ったことを除いて、それが機能するテンプレートとbuildspecファイルをまとめることができました。現在、プレースホルダーのインラインコードがあります。

基本的に、CodeBuildファイル(CodePipelineの出力アーティファクト)を取得するために、Lambda関数のCode:プロパティに何を入れる必要がありますか?

template.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/*
10
mth

AWSサポートのおかげでついにこれに対する解決策を見つけました。まず、このJSONをCodePipelineのCloudFormationデプロイメントステップのパラメーターオーバーライドに配置しました。

{
  "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で出力アーティファクトの場所を動的に取得できるため、テンプレートの移植性が向上します。

12
mth

CodeBuildはZipファイルをS3バケットにドロップする必要があります。したがって、LambdaFunctionリソースのコードセクションでそれをポイントします。

Code:
   S3Bucket: the_bucket_where_CodeBuild_dropped_your_Zip
   S3Key: the_name_of_the_Zip_file_dropped

'ZipFile:'は必要ありません

2
Alex Nelsone

この質問は古いと思いますが、SAMに関しては答えると思いました

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

template.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 build意志pip installあなたのラムダrequirements.txt
  2. sam packageラムダを圧縮し、その内容のmd5で名前を付けて、S3にアップロードします(変更されている場合のみ)
  3. sam deploy CloudFormationチェンジセットを作成し、実行します
0
Neil McGuigan