Serverless Framework+Java+GradleでS3に配置したパッケージからAWS Lambda関数をデプロイしてみた

2020.03.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

タイトルにあげた構成で、最小の手間で動くものをデプロイしてみました。

Java+Gradleな環境はServerless Frameworkの--templateオプションでテンプレートを生成して作成できます。

S3に配置したパッケージをデプロイするには、serverless.ymlのpackage > artifactにパッケージファイルのS3URLを指定するだけです。 公式のガイドはこちらです→Serverless Framework Guide - AWS Lambda Guide - Packaging

環境

$ sw_vers
ProductName:    Mac OS X
:
$ serverless -v
Framework Core: 1.64.1 (standalone)
Plugin: 3.4.1
SDK: 2.3.0

やってみたこと

  1. テンプレートの生成
  2. ビルド実行
  3. パッケージファイルをS3上に配置
  4. serverless.ymlの設定
  5. デプロイ

テンプレートの生成

次のコマンドで、コードのスケルトンを生成します1

$ serverless create --template aws-java-gradle

次の構成でファイルが生成されます

├── build.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── serverless.yml
└── src
    └── main
        ├── java
        │   └── com
        │       └── serverless
        │           ├── ApiGatewayResponse.java
        │           ├── Handler.java
        │           └── Response.java
        └── resources
            └── log4j.properties

ビルド実行

デフォルトの設定のまま、ビルドを実行します。2

$ ./gradlew build

./build/distributionsディレクトリにパッケージファイル(hello.zip)が生成されることを確認します。

パッケージファイルをS3に配置

バケットを用意してパッケージファイルをアップロードします。 CLIで「try-sls-deploy-from-artifact」というバケットにアップロードする場合には次のコマンドになります

$ aws s3 cp ./build/distributions/hello.zip s3://try-sls-deploy-from-artifact/hello.zip

serverless.ymlの設定

パッケージファイルを配置したS3バケットと同じリージョンにデプロイするように設定を変更する必要があります。 また、package > artifactに、アップロードしたパッケージファイルのパスをパス形式で3指定します。

例えば、東京リージョン(ap-northeast-1)に配置された「try-sls-deploy-from-artifact」というバケットにパッケージファイルをアップロードした場合には次のような設定になります。

service: service-200329
provider:
  name: aws
  runtime: java8
  region: ap-northeast-1
package:
  artifact: https://s3.amazonaws.com/try-sls-deploy-from-artifact/hello.zip
functions:
  hello:
    handler: com.serverless.Handler

デプロイ

あとはデプロイするだけです。

$ serverless deploy

さいごに

Serverless Frameworkを使ったビルド方法の紹介でした。 ちなみに個人的には脚注にも少し記載しましたが、artifactのURLを パス形式で 記載する必要があるという点でハマりました。 誰かの参考になれば幸いです。

参考


  1. テンプレートを利用しない場合には、次の記事を参考にファイルを構成してください。Java 関数の ZIP デプロイパッケージの作成 - AWS Lambda 
  2. windows環境の方はバッチファイル(./gradlew.bat)を利用します 
  3. 仮想ホスト形式ではなく、パス形式(https://s3.amazonaws.com/bucket-name/keyname) で指定します。参考→https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/UsingBucket.html#access-bucket-intro