AWS LambdaのデプロイをJenkinsで自動化しようぜ。という記事です。
はじめに
- 今回も小ネタ。
- はじめはHelloWorldで遊んでいても、複雑なものを作り始めると繰り返しFunctionの再登録をしたくなるわけですが、AWSのマネジメントコンソールからjarをアップロードしてFuctionの再登録する手間が面倒になってくるわけです。
- また、気付いたら依存ライブラリが多くなってしまい5MBくらいのjarになったあたりからアップロードするまでの時間がかかりすぎて段々イライラしてきます。
- ということでJenkinsを使ってLambdaFunctionを自動登録する方法をご紹介します。Jenkinsになれた人なら30分くらいあればできると思います。
処理の流れ
- BitBucketへのコミット
- BitBucketのweb hookでJenkinsのビルド起動
- ビルド(Jenkins)
- S3へのjarのアップロード(Jenkins)
- S3からLambdaFunctionの登録(Jenkins)
私の環境では上記のような感じで稼働していますが、webhookとかそんなに目新しい話でもないので4と5についてご紹介します。
前準備
- S3へのファイルアップロードもS3からLambdaへのFunction登録もAWS上のJenkinsから行います。
- S3とLambdaへのアクセスするときにアクセスキーとシークレットアクセスキーは使いません。
- 代わりにInstanceProfileを利用しますので事前にJenkinsが稼働するEC2のインスタンスに対してS3とLambdaにアクセスできる権限をIAM Roleで付与しておいてください。
S3へのjarのアップロード
- S3プラグインを使うことでビルド後にできたjarファイルをS3にアップロードしてくれます。
- [Jenkinsの管理] - [システムの設定] - [Amazon S3 profile]に以下のように設定します。
- Jenkinsのビルド設定画面で[ビルド後の処理の追加] - [Publish artifacts to S3 bucket]をクリックして以下にならって設定します。
- これで設定は完了です。超簡単ですね。
S3からLambdaFunctionの登録
- AWS Lambda Pluginを使用します。
- S3に登録されたモジュールを取得してLambdaFunctionに登録してくれるプラグインです。
- Jenkinsのビルド設置画面で[ビルド後の処理の追加] - [AWS Lambda Deployment]をクリックします。
- 設定の内容はAWSのマネジメントコンソールでの設定と変わりませんが注意点はロール名でして、ARNで記載する必要があります。また、LambdaのVPN対応も行われていまして、[高度な設定]をクリックするとVPCとSecurityGroupを登録することができます。
Lambda Functionが更新されているのか?
- 実はマネジメントコンソールからだと更新されているかどうかがよくわかりません。
- そういう場合はaws cliを使ってfunctionのLast Modifiedを見てあげるとか、Descriptionにビルド時間を入れてあげると良いと思います。
- ちなみにLastModifiedは以下のようなコマンドでみることができます。
[ec2-user@ip-10-0-1-26 target]$ aws lambda get-function --function-name Ec2InstanceState --region ap-northeast-1 | jq
{
"Code": {
"RepositoryType": "S3",
"Location": "https://xxxxxx"
},
"Configuration": {
"FunctionName": "Ec2InstanceState",
"MemorySize": 512,
"CodeSize": 8802205,
"FunctionArn": "arn:aws:lambda:ap-northeast-1:194851312534:function:Ec2InstanceState",
"Handler": "jp.gr.java_conf.uzresk.cmp.activity.aws.ec2.Ec2InstanceActivity::xxxx",
"Role": "arn:aws:iam::123456789012:role/LambdaFunction",
"Timeout": 300,
"LastModified": "2016-03-14T06:09:37.885+0000",
"Runtime": "java8",
"Description": "getting ec2 instance status"
}
}
まとめ
- 1 Function入れ替えるのに5分くらいかかっていたのが20秒で済むようになりました。
- 私が使っているLambdaFunctionはせいぜい10個〜20個程度なのでいちいち設定すれば良いのですが、たくさんになった場合は再考が必要ですね。ということで小ネタでした。