Help us understand the problem. What is going on with this article?

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のコードの確認をします。

lambroll001.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

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

lambrollをGitLab Runnerで利用する

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

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

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

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

pipeline001.png

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

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

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

pipeline003.png

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

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

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

pipeline004.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

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

あとはテスト

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした