かんがるーさんの日記

最近自分が興味をもったものを調べた時の手順等を書いています。今は Spring Boot をいじっています。

Serverless Framework で deploy 用ディレクトリへ移動→環境変数を設定する方法で deploy する環境を切り替える(その2)

概要

記事一覧はこちらです。

Serverless Framework で deploy 用ディレクトリへ移動→環境変数を設定する方法で deploy する環境を切り替える(その1) の続きです。

参照したサイト・書籍

目次

  1. deploy/remove 用の npm-scripts を記述する
  2. stages/dev に移動して開発環境(dev)に deploy する
  3. 動作確認する(dev)
  4. stages/stg に移動してステージング環境(stg)に deploy する
  5. 動作確認する(stg)

手順

deploy/remove 用の npm-scripts を記述する

package.json に deploy/remove 用の npm-scripts を記述します。

{
  "name": "ksbysample-serverless-deploy",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "deploy-service": "per-env",
    "deploy-service:development": "cross-env-shell \"cd $SERVICE_DIR && aws-vault exec $AWS_PROFILE -- bash -c \\\"npx sls deploy -v\\\"\"",
    "deploy-service:ci": "cross-env-shell \"cd $SERVICE_DIR && npx sls deploy -v\"",
    "remove-service": "per-env",
    "remove-service:development": "cross-env-shell \"cd $SERVICE_DIR && aws-vault exec $AWS_PROFILE -- bash -c \\\"npx sls remove -v\\\"\"",
    "remove-service:ci": "cross-env-shell \"cd $SERVICE_DIR && npx sls remove -v\"",
    "deploy:shared-package-layer": "cross-env SERVICE_DIR=layers/shared_package_layer run-s deploy-service",
    "remove:shared-package-layer": "cross-env SERVICE_DIR=layers/shared_package_layer run-s remove-service",
    "deploy:image-service": "cross-env SERVICE_DIR=services/image_service run-s deploy-service",
    "remove:image-service": "cross-env SERVICE_DIR=services/image_service run-s remove-service",
    "deploy:sample-service": "cross-env SERVICE_DIR=services/sample_service run-s deploy-service",
    "remove:sample-service": "cross-env SERVICE_DIR=services/sample_service run-s remove-service",
    "deploy:layers": "run-p deploy:shared-package-layer",
    "remove:layers": "run-p remove:shared-package-layer",
    "deploy:services": "run-s deploy:image-service deploy:sample-service",
    "remove:services": "run-s remove:image-service remove:sample-service",
    "deploy:all": "run-s deploy:layers deploy:services",
    "remove:all": "run-s remove:services remove:layers"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/ksby/ksbysample-serverless-deploy.git"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "bugs": {
    "url": "https://github.com/ksby/ksbysample-serverless-deploy/issues"
  },
  "homepage": "https://github.com/ksby/ksbysample-serverless-deploy#readme",
  "devDependencies": {
    "cross-env": "^7.0.2",
    "npm-run-all": "^4.1.5",
    "per-env": "^1.0.2",
    "serverless": "^1.74.1",
    "serverless-python-requirements": "^5.1.0"
  }
}

deploy:all タスクのフローは以下のようになります。

f:id:ksby:20200714231201p:plain

  • eploy:shared-package-layerdeploy:image-servicedeploy:sample-service では cross-env で環境変数 SERVICE_DIR に移動先のディレクトリのパスをセットして deploy-service タスクを呼び出します。

    ポイントとしては npm-scripts は stages/dev の下に cd してから実行しても実行時のディレクトリはプロジェクトのルートディレクトリ(node_modules のあるディレクトリ)になるので、環境変数 SERVICE_DIR に設定するパスはそこからの相対パスにする必要があるという点です。

    試しに deploy-service:development タスクを "deploy-service:development": "cross-env-shell \"ls -l\"" に変更してから npm run deploy:all を実行してみると、deploy-service:development タスクが呼び出される度にプロジェクトのルートディレクトリにある node_modules ディレクトリが表示されています。

    f:id:ksby:20200714232915p:plain f:id:ksby:20200714233026p:plain

  • deploy-service タスクが呼び出されると per-env により NODE_ENV の値が未セットの場合(deployment になる)には deploy-service:development タスクが、NODE_ENV=ci がセットされている場合には deploy-service:ci タスクが呼び出されます。

  • deploy-service:development 及び deploy-service:ci タスクでは cross-env-shell(cross-env に含まれている)で cd 及び sls deploy を実行します。cross-env-shell で実行することで git-bash や cross-env で設定された環境変数cd 及び sls deploy 側で利用できるようになります。

stages/dev に移動して開発環境(dev)に deploy する

stages/dev に移動してから npm run deploy:all を実行します。

f:id:ksby:20200716232617p:plain f:id:ksby:20200716232826p:plain f:id:ksby:20200716232925p:plain f:id:ksby:20200716233017p:plain f:id:ksby:20200716233118p:plain f:id:ksby:20200716233224p:plain

作成されたリソースを確認すると全てに STAGE 名である dev が入っています。

■Lambda 関数 f:id:ksby:20200716233907p:plain

■Lambda レイヤー f:id:ksby:20200716234028p:plain

■IAM ロール f:id:ksby:20200716234209p:plain

■CloudWatch ロググループ f:id:ksby:20200716234315p:plain

■S3 バケット f:id:ksby:20200716234452p:plain f:id:ksby:20200716234605p:plain

■CloudFormation スタック f:id:ksby:20200716234745p:plain

API Gateway f:id:ksby:20200716234840p:plain

■SQS キュー f:id:ksby:20200716235001p:plain

■DynamoDB テーブル f:id:ksby:20200716235124p:plain

動作確認する(dev)

Postman から API Gateway の endpoint にアクセスすると 200 OK が返ってきて、

f:id:ksby:20200716235549p:plain

DynamoDB の sample-table-dev テーブルにデータが保存されました。

f:id:ksby:20200716235723p:plain

ksbysample-upload-bucket-dev バケットに sample.jpg をアップロードすると、

f:id:ksby:20200717000041p:plain f:id:ksby:20200717000134p:plain

ksbysample-resize-bucket-dev バケットに sample_thumb.jpg が生成されました。

f:id:ksby:20200717000245p:plain f:id:ksby:20200717000323p:plain

S3 --> Lambda --> S3 の処理をする時の X-Ray を見てみると以下のように表示されていました。

f:id:ksby:20200717000955p:plain

問題なく動作しています。

stages/stg に移動してステージング環境(stg)に deploy する

stages/dev で deploy したリソースは残したままの状態で stages/stg に移動して deploy します。

f:id:ksby:20200717064054p:plain (..........途中省略..........) f:id:ksby:20200717064155p:plain

作成されたリソースを確認すると全てに STAGE 名である stg が入っていました(キャプチャは省略)。

動作確認する(stg

Postman から API Gateway の endpoint にアクセスすると 200 OK が返ってきて、

f:id:ksby:20200717064948p:plain

DynamoDB の sample-table-stg テーブルにデータが保存されました。

f:id:ksby:20200717065104p:plain

ksbysample-upload-bucket-stg バケットに sample2.jpg をアップロードすると、

f:id:ksby:20200717065229p:plain f:id:ksby:20200717065309p:plain

ksbysample-resize-bucket-stg バケットに sample2_thumb.jpg が生成されました。

f:id:ksby:20200717065412p:plain f:id:ksby:20200717065455p:plain

dev のリソースがある状態でも stg も問題なく動作しました。

履歴

2020/07/19
初版発行。