そのため、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/*
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で出力アーティファクトの場所を動的に取得できるため、テンプレートの移植性が向上します。
CodeBuildはZipファイルをS3バケットにドロップする必要があります。したがって、LambdaFunctionリソースのコードセクションでそれをポイントします。
Code:
S3Bucket: the_bucket_where_CodeBuild_dropped_your_Zip
S3Key: the_name_of_the_Zip_file_dropped
'ZipFile:'は必要ありません
この質問は古いと思いますが、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
ノート:
sam build
意志pip install
あなたのラムダrequirements.txt
sam package
ラムダを圧縮し、その内容のmd5で名前を付けて、S3にアップロードします(変更されている場合のみ)sam deploy
CloudFormationチェンジセットを作成し、実行します