この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
いわさです。
CodeCommitからSAMのデプロイを行いたかったのですが、シンプルにデプロイするならばCodeBuildでsam deploy
することが多いみたいです。
今回は将来的には以下のようなステージをパイプラインに組み込めるように、CodePipelineでデプロイを行ってみました。
- Runscopeなどでテスト
- 本番ステージデプロイ前に手動承認
CodePipelineでデプロイタイミングをコントロール出来ると柔軟かなと思ったので。
SAMテンプレートを用意
クラスメソッドのコーポレートサイトを参照するHTTPプロキシです。
Lambdaも登場しません。
template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: ---
Parameters:
ApiName:
Description: API Gateway Name
Type: String
StageName:
Description: API Gateway StageName
Type: String
Resources:
Api:
Type: AWS::Serverless::Api
Properties:
Name: !Ref ApiName
EndpointConfiguration: REGIONAL
OpenApiVersion: 3.0.1
StageName: !Ref StageName
DefinitionBody:
Fn::Transform:
Name: AWS::Include
Parameters:
Location: ./openapi.json
OpenAPIのAPI Gateway拡張でIntegrationは定義しています。
openapi.json
{
"openapi" : "3.0.1",
"paths" : {
"/" : {
"get" : {
"responses" : {
"200" : {
"description" : "200 response",
"content" : {
"application/json" : {
"schema" : {
"$ref" : "#/components/schemas/Empty"
}
}
}
}
},
"x-amazon-apigateway-integration" : {
"type" : "http_proxy",
"httpMethod" : "GET",
"uri" : "https://classmethod.jp/",
"responses" : {
"default" : {
"statusCode" : "200"
}
},
"passthroughBehavior" : "when_no_match"
}
}
}
},
"components" : {
"schemas" : {
"Empty" : {
"title" : "Empty Schema",
"type" : "object"
}
}
}
}
CodeBuildでSAM Packageする
CodeBuildでデプロイは行わないですが、相対パスでOpenAPIドキュメントを参照させているので、sam package
でパッケージングしておきます。
S3バケットを事前に作成済みで、CodeBuildサービスロールにはアクセス権限を与えてあります。
buildspec.yaml
version: 0.2
phases:
install:
runtime-versions:
python: 3.8
build:
commands:
- sam package --template-file template.yaml --s3-bucket apigateway-codepipeline-20210225 --output-template-file packaged-template.yml
artifacts:
files:
- packaged-template.yml
CodePipelineを設定
作成するパイプラインはCodeCommit
->CodeBuild
->CloudFormation
というシンプルなものです。
デプロイアクションではCloudFormationをアクションプロバイダーに選択します。
CodePipelineでは多様なアクションがデフォルトで用意されているので良いですね。
ここに用意されているもの以外でもLambdaやStep Functionsを使ってカスタムアクションを用意することも出来ます。
CloudFormationの設定ではCodeBuildのsam package
で変換されたテンプレートを使うように指定します。
ここまで設定するだけで、CodeCommitの変更をトリガーにSAMがデプロイされます。
これで、手動承認などCodePipelineの機能をどんどん使うことが出来ますね。
まとめ
本日はCodePipelineを使ってSAMをデプロイしました。
特に難しいことも無い内容ではありますが、CodePipelineからデプロイする記事があまり多くなかったので自分の整理のためにも記事にしてみました。