Serverless Framework で deploy 用ディレクトリへ移動→環境変数を設定する方法で deploy する環境を切り替える(その3、CircleCI に deploy する)
概要
記事一覧はこちらです。
Serverless Framework で deploy 用ディレクトリへ移動→環境変数を設定する方法で deploy する環境を切り替える(その2) の続きです。
参照したサイト・書籍
Making Serverless CI/CD Easier with CircleCI and Serverless Framework
https://aws.amazon.com/jp/blogs/apn/making-serverless-ci-cd-easier-with-circleci-and-serverless-framework/Welcome to CircleCI Documentation
https://circleci.com/docs/ja/2.0/- CircleCI のドキュメントの日本語版。
Configuring CircleCI
https://circleci.com/docs/2.0/configuration-reference/あなたがnpm installをしてはいけない時
https://blog.minimalcorp.com/users/jigen/posts/6f325dc9b8a00370b6aedf47a34cb3cenpm ciを使おう あるいはより速く
https://qiita.com/mstssk/items/8759c71f328cab802670まさかPushデバッグしてないよね? よく使うCircleCIのデバッグ方法
https://blog.vtryo.me/entry/circleci-debug-methodいまさらだけどCircleCIに入門したので分かりやすくまとめてみた
https://qiita.com/gold-kou/items/4c7e62434af455e977c2
目次
- .circleci/config.yml を作成する
- CircleCI で Project の設定をする
- AWS マネジメントコンソールで circle-ci ユーザーを作成し、アクセスキーを作成する
- CircleCI の管理画面から AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY を設定する
- .circleci/config.yml で
NODE_ENV=ci npm run deploy:all
を実行するよう変更する - commit&push して CircleCI から deploy する
- AWS に作成したリソースを確認する
- 動作確認する
- 何も変更せずに deploy し直すと cache の効果でどのくらい時間が短縮されるのか?
- stages/prod/custom-shared-package-layer.yml の説明
- CircleCI で deploy したリソース一式を削除する
手順
.circleci/config.yml を作成する
.circleci/config.yml を新規作成し、まずは checkout だけ記述します。
version: 2.1 jobs: deploy: docker: - image: lambci/lambda:build-python3.8 steps: - checkout workflows: version: 2 deploy: jobs: - deploy: filters: branches: only: master
Docker Image は serverless-python-requirements プラグインが使用している lambci/lambda:build-python3.8 を使用します。以下の理由で使いやすかったからです。
- Making Serverless CI/CD Easier with CircleCI and Serverless Framework の記事で https://circleci.com/orbs/registry/orb/circleci/serverless-framework の存在を知ったが、npm のインストールと serverless-python-requirements プラグインを利用した deploy 方法がよく分からなかった。
- lambci/lambda は serverless-python-requirements プラグインを利用した deploy 時に使用されているので、この点については調査不要。
- npm のインストールについては、lambci/lambda が AWS Labmda の実行環境を作成するためのもので Node.js もサポートしており、docker-lambda/nodejs12.x/build/Dockerfile を見れば Node.js のインストール方法が分かった。
CircleCI で Project の設定をする
CircleCI の管理画面から「Proejcts」の画面を表示し、ksbysample-serverless-deploy の「Set Up Project」ボタンをクリックします。
.circleci/config.yml は追加してあるので「Add Manually」ボタンをクリックします。
下の画像のダイアログが表示されるので「Start Building」ボタンをクリックします。
workflow が実行されて SUCCESS になります。
AWS マネジメントコンソールで circle-ci ユーザーを作成し、アクセスキーを作成する
本番環境(prod)を deploy するアカウントで circle-ci ユーザーを作成し、アクセスキーも作成します。アクセス権限は AdministratorAccess ポリシーをアタッチします。
CircleCI の管理画面から AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY を設定する
CircleCI の ksbysample-serverless-deploy の画面右上の「Project Settings」ボタンをクリックします。
Project Settings 画面が表示されたら左側の「Environment Variables」を選択した後、右側の「Add Environment Variable」ボタンをクリックして AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY を追加します。
.circleci/config.yml で NODE_ENV=ci npm run deploy:all
を実行するよう変更する
.circleci/config.yml を以下のように変更します。
version: 2.1 jobs: deploy: docker: - image: lambci/lambda:build-python3.8 environment: AWS_DEFAULT_REGION: ap-northeast-1 STAGE: prod LOG_LEVEL: ERROR POWERTOOLS_TRACE_DISABLED: true NODE_PATH: /opt/nodejs/node12/node_modules:/opt/nodejs/node_modules:/var/runtime/node_modules steps: - checkout - run: name: install nodejs12.x command: curl https://lambci.s3.amazonaws.com/fs/nodejs12.x.tgz | tar -zx -C / - run: node -v - run: npm -v # Caching Dependencies # https://circleci.com/docs/2.0/caching/ - restore_cache: keys: - asset-cache-v1-{{ arch }}-{{ .Branch }}-{{ .Environment.CIRCLE_SHA1 }} - asset-cache-v1-{{ arch }}-{{ .Branch }} - asset-cache-v1 - run: npm ci - run: pip install -r requirements.txt - run: python -m unittest -v - run: NODE_ENV=ci npm run deploy:all - save_cache: key: asset-cache-v1-{{ arch }}-{{ .Branch }}-{{ .Environment.CIRCLE_SHA1 }} paths: # https://docs.npmjs.com/cli/ci#example - $HOME/.npm - /var/lang/lib/python3.8 - /root/project/.cache workflows: version: 2 deploy: jobs: - deploy: filters: branches: only: master
- 環境変数 AWS_DEFAULT_REGION を CircleCI の管理画面で設定すると API Gateway の endpoint の URL の一部が
*
で表示されるのですが、手間なので config.yml に定義して*
表示されないようにします。 - direnv はないので環境変数 STAGE、LOG_LEVEL、POWERTOOLS_TRACE_DISABLED を config.yml に設定します。
- NODE_PATH は docker-lambda/nodejs12.x/build/Dockerfile で設定されていたのでコピーしてきました。
- restore_cache、save_cache の keys は Full Example of Saving and Restoring Cache のをそのままコピーしています。
- save_cache の paths は、
- npm ciを使おう あるいはより速く の記事を見て npm がキャッシュしている
$HOME/.npm
を追加。 pip install -r requirements.txt
のインストール先である/var/lang/lib/python3.8
を追加。- serverless-python-requirements プラグインの cache ディレクトリである
/root/project/.cache
を追加。
- npm ciを使おう あるいはより速く の記事を見て npm がキャッシュしている
commit&push して CircleCI から deploy する
master ブランチに commit&push すると worflow が動作して無事 SUCCESS になりました。
各 step にかかった時間は以下の通りです。
NODE_ENV=ci npm run deploy:all
の状況を見ると per-env の後に cross-env-shell "cd $SERVICE_DIR && npx sls deploy -v"
が実行されており、npm-scripts の deploy-service:ci
が実行されていることが分かります。
AWS に作成したリソースを確認する
作成されたリソースを確認すると全てに STAGE 名である prod
が入っています。
■Lambda 関数
■Lambda レイヤー
■IAM ロール
■CloudWatch ロググループ
■S3 バケット
■CloudFormation スタック
■SQS キュー
■DynamoDB テーブル
動作確認する
Postman から API Gateway の endpoint にアクセスすると 200 OK が返ってきて、
DynamoDB の sample-table-prod テーブルにデータが保存されました。
ksbysample-upload-bucket-prod バケットに sample.jpg をアップロードすると、
ksbysample-resize-bucket-prod バケットに sample_thumb.jpg が生成されました。
Pillow を使用したリサイズ処理も問題なく動作しています。
何も変更せずに deploy し直すと cache の効果でどのくらい時間が短縮されるのか?
.circleci/config.yml 内で1行改行してから revert して master ブランチに commit&push してみると、前回と比較して deploy 時間が約半分になりました。
ただし、この時気づきましたが Lambda Layer の shared_package_layer のバージョンが1つ上がっていました。少し試してみたのですが deploy すると変更点がなくてもバージョンが1つ上がってしまうようです。変更がなければバージョンが上がらないようにしたいのですが、CI/CD 前提ならば Lambda Layer は別レポジトリに分けた方が良いのかもしれません。。。
stages/prod/custom-shared-package-layer.yml の説明
stages/prod/custom-shared-package-layer.yml に以下のように記述しましたが、
pythonRequirements: # dockerizePip: true fileName: ../../requirements.txt noDeploy: - aws-lambda-context - boto3 - moto useStaticCache: true useDownloadCache: true cacheLocation: /root/project/.cache staticCacheMaxVersions: 3 layer: name: "shared-package-layer-${env:STAGE}" description: 共通パッケージ用 Lambda Layer
- デフォルトの cacheLocation ではエラーになるため、CircleCI の working_directory の下のディレクトリを指定します。
- useStaticCache、useDownloadCache を true にして cache を使うよう設定します。
- serverless-python-requirements プラグインの cache を CircleCI の cache 機能で cache するので、staticCacheMaxVersions で履歴数を少なめに指定してサイズが大きくならないようにします。
CircleCI で deploy したリソース一式を削除する
stages/prod/.envrc で AWS_PROFILE に削除可能な profile を設定しておいてから、以下のコマンドを実行すれば削除されます。
$ cd stages/prod $ npm run remove:all
履歴
2020/07/19
初版発行。