CodePipelineを使ってSAMでシンプルなAPI Gatewayをデプロイしてみた
いわさです。
CodeCommitからSAMのデプロイを行いたかったのですが、シンプルにデプロイするならばCodeBuildでsam deploy
することが多いみたいです。
今回は将来的には以下のようなステージをパイプラインに組み込めるように、CodePipelineでデプロイを行ってみました。
- Runscopeなどでテスト
- 本番ステージデプロイ前に手動承認
CodePipelineでデプロイタイミングをコントロール出来ると柔軟かなと思ったので。
SAMテンプレートを用意
クラスメソッドのコーポレートサイトを参照するHTTPプロキシです。
Lambdaも登場しません。
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" : "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サービスロールにはアクセス権限を与えてあります。
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からデプロイする記事があまり多くなかったので自分の整理のためにも記事にしてみました。