Lambdaのコードだけ入れ替えしたい
サーバーレスが気になって夜も6時間しか眠れないサーバーレス気になる人間「ながの」です。
AWSでサーバーレスと言えばAWS Lambdaですよね。みなさん、AWS Lambda使ってますか?
Lambdaを使っているとコードだけ入れ替えたいなあ
ってときありますよね?
基本的にはAWSリソースはCloudFormationで管理していますが、ちょっとしたコードの変更なのにCloudFormation動かしたくないですね。CloudFormationを動かした事でリソースが予期せぬ変更をする可能性もないとは言えないですし。
でも都度都度CLIでやるのも面倒ですし、コードをコピペして書き換えるのはもっといやですよね。
じゃあどうすればいいんだー!?
ってことでlambroll
を使ってみました。
lambrollとは?
GitHub - fujiwara/lambroll: lambroll is a minimal deployment tool for AWS Lambda.
シンプル/ミニマルな Lambda のデプロイツールです。
以下で作者自身の紹介した記事が見れます。
AWS Lambda のミニマルなデプロイツール lambroll を書いた - 酒日記 はてな支店
使い方は簡単です。
- lambrollをインストール
- 既存のLambda関数をダウンロード
- ダウンロードされたzipファイル内にあるコードを変更
- lambroll deployするとコードだけ入れ替わっている
やってみましょう。
現状のLambdaのコードの確認をします。
では、lambrollを使います。まずは既存のLambdaのコードをダウンロードします。
$ mkdir test-lambroll
$ cd test-lambroll
$ lambroll init --region="ap-northeast-1" --function-name test-lambroll --download
2019/12/04 11:09:01 [info] lambroll v0.3.1
2019/12/04 11:09:02 [info] function test-lambroll found
2019/12/04 11:09:02 [info] downloading function.zip
2019/12/04 11:09:03 [info] creating .lambdaignore
2019/12/04 11:09:03 [info] creating function.json
2019/12/04 11:09:03 [info] completed
ダウンロードされた内容は以下のようになっています
$ ll
total 24
drwxrwxrwx 1 nagano nagano 4096 Dec 4 11:09 ./
drwxrwxrwx 1 nagano nagano 4096 Dec 4 11:05 ../
-rw-r--r-- 1 nagano nagano 48 Dec 4 11:09 .lambdaignore
-rw-r--r-- 1 nagano nagano 548 Dec 4 11:09 function.json
-rw-r--r-- 1 nagano nagano 18882 Dec 4 11:09 function.zip
function.zip
内を確認しましょう。
$ unzip function.zip
ソースコードであるtest-lambroll.py
があるのがわかります。
$ ll
total 24
drwxrwxrwx 1 nagano nagano 4096 Dec 4 11:10 ./
drwxrwxrwx 1 nagano nagano 4096 Dec 4 11:05 ../
-rw-r--r-- 1 nagano nagano 48 Dec 4 11:09 .lambdaignore
-rw-r--r-- 1 nagano nagano 548 Dec 4 11:09 function.json
-rw-r--r-- 1 nagano nagano 18882 Dec 4 11:09 function.zip
-rw-rw-rw- 1 nagano nagano 70 Dec 4 01:00 test-lambroll.py
test-lambroll.py
を編集します。「#lambrollから追加」を追記します。
$ vi test-lambroll.py
1 def lambda_handler(event, context):
2 print("Lambdaが呼ばれたよ")
3 #lambrollから追加
では、変更したソースコードをLambdaにアップロードします。
$ lambroll deploy --region="ap-northeast-1" --src="."
2019/12/04 11:18:32 [info] lambroll v0.3.1
2019/12/04 11:18:32 [info] starting deploy function test-lambroll
2019/12/04 11:18:33 [info] creating zip archive from .
2019/12/04 11:18:33 [info] zip archive wrote 20747 bytes
2019/12/04 11:18:33 [info] updating function configuration
2019/12/04 11:18:34 [info] updating function code
2019/12/04 11:18:34 [info] deployed version 6
2019/12/04 11:18:34 [info] updating alias set current to version 6
2019/12/04 11:18:34 [info] alias updated
2019/12/04 11:18:34 [info] completed
実際にLambdaを見てみましょう。
おおー。ちゃんと手元で編集した内容がLambdaに反映されていますね!
lambrollをGitLab Runnerで利用する
いい感じにコードだけ変更できましたが、これだけだと毎回手元でlambrollを実行しないといけません。
そこで、LambdaのコードをせっかくGitLabで管理してるので、どうせだったらコードを編集してGitLabにプッシュしたらlambrollが起動してコードをデプロイしてくれればいいのでは?と思いました。
とういうことで、試してみました。
.gitlab-ci.yml
を書きます。GitLab上のSet up CI/CD
をクリックします。
ここに.gitlab-ci.yml
を書いていきます。
ymlに記載する内容は上記で手動実行した流れそのままです。
- lambrollをダウンロード
- lambroll展開して/usr/local/binにコピー
- コードのあるディレクトリに戻ってlambrollを実行
今回は以下のような内容にしました。
job-a:
script:
- pwd
- cd /tmp
- wget https://github.com/fujiwara/lambroll/releases/download/v0.3.1/lambroll_v0.3.1_linux_amd64.tar.gz
- tar -xvzf lambroll_v0.3.1_linux_amd64.tar.gz
- rm -rf lambroll_v0.3.1_linux_amd64.tar.gz
- cp -p lambroll_v0.3.1_linux_amd64/lambroll /usr/local/bin
- cd /builds/taichi.nagano/test-lambroll
- ls -l
- lambroll deploy --region="ap-northeast-1" --src="."
これで.gitlab-ci.yml
は完成ですが、追加で1つ設定があります。.gitlab-ci.yml
に書いた内容をGitLab Runnerに実行させるためにクレデンシャル情報を設定に入れておきます。
Settings
> CI/CD
> Variables
に記入します。
これで準備は整ったはず。実際にコードを編集(「#GitLabから追加」を追記)してpushします。
$ vi test-lambroll.py
1 def lambda_handler(event, context):
2 print("Lambdaが呼ばれたよ")
3 #lambrollから追加
4 #GitLabから追加
pushするとパイプラインが動き出しました!
パイプラインがpassしたのでログを見てみましょう。
Running with gitlab-runner 12.4.0 (1564076b)
on gitlab-runner-05 qE1rCxMk
Using Docker executor with image docker:19.03.1 ...
Pulling docker image docker:19.03.1 ...
Using docker image sha256:0cecfefe921f22fc898f7a0055358380c8870ab6f05b01999367911714fe9d00 for docker:19.03.1 ...
Running on runner-qE1rCxMk-project-703-concurrent-0 via ubuntu...
Fetching changes with git depth set to 50...
Initialized empty Git repository in /builds/taichi.nagano/test-lambroll/.git/
Created fresh repository.
From https://gitlab.stylez.co.jp/taichi.nagano/test-lambroll
* [new ref] refs/pipelines/6583 -> refs/pipelines/6583
* [new branch] master -> origin/master
Checking out 2b1f299e as master...
Skipping Git submodules setup
$ pwd
/builds/taichi.nagano/test-lambroll
$ cd /tmp
$ wget https://github.com/fujiwara/lambroll/releases/download/v0.3.1/lambroll_v0.3.1_linux_amd64.tar.gz
Connecting to github.com (13.114.40.48:443)
Connecting to github-production-release-asset-2e65be.s3.amazonaws.com (52.217.45.228:443)
lambroll_v0.3.1_linu 2% | | 101k 0:00:42 ETA
lambroll_v0.3.1_linu 100% |********************************| 4426k 0:00:00 ETA
$ tar -xvzf lambroll_v0.3.1_linux_amd64.tar.gz
lambroll_v0.3.1_linux_amd64/
lambroll_v0.3.1_linux_amd64/LICENSE
lambroll_v0.3.1_linux_amd64/README.md
lambroll_v0.3.1_linux_amd64/lambroll
$ rm -rf lambroll_v0.3.1_linux_amd64.tar.gz
$ cp -p lambroll_v0.3.1_linux_amd64/lambroll /usr/local/bin
$ cd /builds/taichi.nagano/test-lambroll
$ ls -l
total 8
-rw-rw-rw- 1 root root 548 Dec 2 07:38 function.json
-rw-rw-rw- 1 root root 96 Dec 2 07:38 test-lambroll.py
$ lambroll deploy --region="ap-northeast-1" --src="."
2019/12/02 07:38:11 [info] lambroll v0.3.1
2019/12/02 07:38:11 [info] starting deploy function test-lambroll
2019/12/02 07:38:11 [info] creating zip archive from .
2019/12/02 07:38:11 [info] zip archive wrote 20743 bytes
2019/12/02 07:38:11 [info] updating function configuration
2019/12/02 07:38:12 [info] updating function code
2019/12/02 07:38:13 [info] deployed version 5
2019/12/02 07:38:13 [info] updating alias set current to version 5
2019/12/02 07:38:13 [info] alias updated
2019/12/02 07:38:13 [info] completed
Job succeeded
正常に完了しているようです。
では、Lambdaを確認してみましょう。
ちゃんとコードが変更されていますね!!
あとはテスト
これでCDはできたと思いますが、このままだと問答無用にLambdaのコードが入れ替わってしまうので、テストを間に入れたいですね。
そんなわけで、テストを勉強中です。