AWS Lambda関数をJavaで実装する(4)CodeBuildを使ってLambdaアプリをデプロイする(完全版)

先日より、Flywayを使ってRDSのデータベースマイグレーションをLambda関数を使って実装できないかやってみています。前回までの記事は以下を参照。

今回は、CodeBuildを使ってデプロイすることをチャレンジしてみることにしました。前回の続きです。

CodeBuildの設定ファイルbuildspec.ymlにてpost_buildにてsam packagesam deployを実行してあげます。

version: 0.2

phases:
  install:
    runtime-versions:
      java: corretto17
  build:
    commands:
      - ./gradlew clean packageLibs packageSkinny
  post_build:
    commands:
      - sam package --template-file template.yml --output-template-file package.yml --s3-bucket $S3BUCKET
      - sam deploy --template-file package.yml --stack-name aws-flyway-lambda --capabilities CAPABILITY_IAM
artifacts:
  files:
    - '*.zip'
  base-directory: 'build/distributions'

自分がハマったのは、sam deployの処理が終わらなない事象でした。CloudFormationを覗いてみるとREVIEW_IN_PROGRESSのままで止まっていたので、いろいろと見直すと、作成していたtemplate.yml内のTypeの指定が誤っていました(AWS::Serverless::LayerVersionとすべきところをAWS::Serverless:LayerVersionにしていました。:が足りませんでした)。完全版のtemplate.ymlは以下の通りです。

AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Description: An AWS Lambda application that calls the Flyway api
Resources:
  function:
    Type: AWS::Serverless::Function
    # 関数の定義
    Properties:
      CodeUri: build/distributions/aws_flyway_lambda-thin-1.0.zip
      Handler: com.github.miyohide.aws_flyway_lambda.MyLambda::handleRequest
      Runtime: java17
      Description: Java function
      MemorySize: 1024
      Timeout: 10
      # Function's execution role
      Policies:
        - AWSLambdaBasicExecutionRole
        - AWSLambda_ReadOnlyAccess
        - AWSXrayWriteOnlyAccess
        - AWSLambdaVPCAccessExecutionRole
      Tracing: Active
      Layers:
        - !Ref libs
  # Layerの定義
  libs:
    Type: AWS::Serverless::LayerVersion
    Properties:
      LayerName: flyway-java-lib
      Description: Dependencies for the flyway java app.
      ContentUri: build/distributions/aws_flyway_lambda-libs-1.0.zip
      CompatibleRuntimes:
        - java17

あとは権限不足でエラーとなりました。Layerを使っていたのでlambda:PublishLayerVersionlambda:GetLayerVersionの権限エラーとなっていたので、付与したら正常終了しました。

もちろん、デプロイしたLambda関数も正常に動くことが確認できました。