先日より、Flywayを使ってRDSのデータベースマイグレーションをLambda関数を使って実装できないかやってみています。前回までの記事は以下を参照。
- AWS Lambda関数をJavaで実装する(1) - miyohide's blog
- AWS Lambda関数をJavaで実装する(2)LambdaからRDSへ接続する - miyohide's blog
- AWS Lambda関数をJavaで実装する(3)CodeBuildを使ってLambdaアプリをデプロイする - miyohide's blog
今回は、CodeBuildを使ってデプロイすることをチャレンジしてみることにしました。前回の続きです。
CodeBuildの設定ファイルbuildspec.yml
にてpost_build
にてsam package
やsam 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:PublishLayerVersion
とlambda:GetLayerVersion
の権限エラーとなっていたので、付与したら正常終了しました。
もちろん、デプロイしたLambda関数も正常に動くことが確認できました。