CodePipelineを使ってSAMでシンプルなAPI Gatewayをデプロイしてみた

2022.02.25

この記事は公開されてから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からデプロイする記事があまり多くなかったので自分の整理のためにも記事にしてみました。