lambroll & GitLab CI/CD Pipelineを使ってみた


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 を書いた - 酒日記 はてな支店

使い方は簡単です。

  1. lambrollをインストール
  2. 既存のLambda関数をダウンロード
  3. ダウンロードされたzipファイル内にあるコードを変更
  4. 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に記載する内容は上記で手動実行した流れそのままです。

  1. lambrollをダウンロード
  2. lambroll展開して/usr/local/binにコピー
  3. コードのあるディレクトリに戻って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のコードが入れ替わってしまうので、テストを間に入れたいですね。

そんなわけで、テストを勉強中です。