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.](https://github.com/fujiwara/lambroll)

シンプル/ミニマルな Lambda のデプロイツールです。

以下で作者自身の紹介した記事が見れます。

[AWS Lambda のミニマルなデプロイツール lambroll を書いた - 酒日記 はてな支店](https://sfujiwara.hatenablog.com/entry/lambroll)


使い方は簡単です。

1. lambrollをインストール
2. 既存のLambda関数をダウンロード
3. ダウンロードされたzipファイル内にあるコードを変更
4. lambroll deployするとコードだけ入れ替わっている

やってみましょう。

現状のLambdaのコードの確認をします。

![lambroll001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415280/d163bbec-cf51-7cd3-8690-6b6c8f194f04.png)

では、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を見てみましょう。

![lambroll002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415280/81df2d2b-4691-49e0-211e-c6cd1e66c679.png)

おおー。ちゃんと手元で編集した内容がLambdaに反映されていますね！


## lambrollをGitLab Runnerで利用する

いい感じにコードだけ変更できましたが、これだけだと毎回手元でlambrollを実行しないといけません。

そこで、LambdaのコードをせっかくGitLabで管理してるので、どうせだったらコードを編集してGitLabにプッシュしたらlambrollが起動してコードをデプロイしてくれればいいのでは？と思いました。

とういうことで、試してみました。

`.gitlab-ci.yml`を書きます。GitLab上の`Set up CI/CD`をクリックします。

![pipeline001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415280/658b8ec4-0fe8-fc13-174e-a143723897b5.png)

ここに`.gitlab-ci.yml`を書いていきます。

![pipeline002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415280/14f3b455-26e6-13ef-c3f8-bdd46b9d23f2.png)


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`は完成ですが、追加で１つ設定があります。`.gitlab-ci.yml`に書いた内容をGitLab Runnerに実行させるためにクレデンシャル情報を設定に入れておきます。

`Settings` > `CI/CD` > `Variables`に記入します。

![pipeline003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415280/79631e58-3792-beae-6c49-be76ab6a3808.png)


これで準備は整ったはず。実際にコードを編集（「#GitLabから追加」を追記）してpushします。

```
$ vi test-lambroll.py
  1 def lambda_handler(event, context):
  2         print("Lambdaが呼ばれたよ")
  3         #lambrollから追加
  4         #GitLabから追加
```

pushするとパイプラインが動き出しました！

![pipeline004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415280/2167f832-92b6-9a43-24c8-a4b494d071cc.png)

パイプラインが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を確認してみましょう。

![pipeline005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415280/b4ec4183-03b6-e69e-5e71-5913c738765b.png)

ちゃんとコードが変更されていますね！！

### あとはテスト
これでCDはできたと思いますが、このままだと問答無用にLambdaのコードが入れ替わってしまうので、テストを間に入れたいですね。

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