TypeScriptでマイクロサービスを作ってみる①

技術ネタ

hisayukiです。

前回やったこちらの続きをやろうと思ったので、経過を書きます!
どこまでやるかわかんないので連載形式にしようと思います。

スポンサーリンク

環境設定

前回はローカル環境でのテストまでだったので、実際に環境をプロファイル指定してデプロイしてみました。

まずはserverless.ymlの設定を追記。

service:
  name: serverless-typescript-sample

# Add the serverless-webpack plugin
plugins:
  - serverless-webpack
  - serverless-offline

provider:
  name: aws
  runtime: nodejs8.10
  stage: dev
  region: ap-northeast-1
  profile: serverless
functions:
  hello:
    handler: handler.hello
    events:
      - http:
          method: get
          path: hello

providerstage、region、profileを追記。
今回は開発なのでステージをdevに、リージョンはデフォルトだとバージニアなのでap-northeast-1にして東京を指定。

最後にprofileは実際にデプロイする先のアカウントを指定します。
このとき、どうやら環境変数にAWS_ACCESS_KEY_IDとAWS_SECRET_ACCESS_KEYが設定されてるとprofileを無視されてる気がする。

対処法としてはexport AWS_ACCESS_KEY_ID=とかで環境変数内のAWS_ACCESS_KEY_IDを消しておきましょう。
まぁ・・・AWS CLIも出来る限りちゃんとプロファイル分けて--profileをつける癖をつけたほうが可読性も高くなるしミスも減ると思う。

いざデプロイ

yarn sls deploy
yarn run v1.15.2
$ /Users/hisayuki/vscode/serverless-typescript-sample/node_modules/.bin/sls deploy
Serverless: Bundling with Webpack...
Time: 1473ms
Built at: 2019/04/17 20:54:59
         Asset      Size  Chunks             Chunk Names
    handler.js  33.5 KiB       0  [emitted]  handler
handler.js.map   170 KiB       0  [emitted]  handler
Entrypoint handler = handler.js handler.js.map
 [0] ./node_modules/source-map/lib/util.js 12.6 KiB {0} [built]
 [1] ./node_modules/source-map/lib/source-map-generator.js 14 KiB {0} [built]
 [2] ./node_modules/source-map/lib/base64-vlq.js 4.6 KiB {0} [built]
 [3] ./node_modules/source-map/lib/array-set.js 3.12 KiB {0} [built]
 [4] ./handler.ts 297 bytes {0} [built]
 [5] ./node_modules/source-map-support/register.js 25 bytes {0} [built]
 [6] ./node_modules/source-map-support/source-map-support.js 17.6 KiB {0} [built]
 [7] ./node_modules/source-map/source-map.js 405 bytes {0} [built]
 [9] ./node_modules/source-map/lib/mapping-list.js 2.28 KiB {0} [built]
[10] ./node_modules/source-map/lib/source-map-consumer.js 39.6 KiB {0} [built]
[13] ./node_modules/source-map/lib/source-node.js 13.5 KiB {0} [built]
[14] external "path" 42 bytes {0} [built]
[15] external "fs" 42 bytes {0} [optional] [built]
[16] ./node_modules/buffer-from/index.js 1.56 KiB {0} [built]
[17] external "module" 42 bytes {0} [optional] [built]
    + 3 hidden modules
Serverless: Packaging service...
Serverless: Service files not changed. Skipping deployment...
Service Information
service: serverless-typescript-sample
stage: dev
region: ap-northeast-1
stack: serverless-typescript-sample-dev
resources: 10
api keys:
  None
endpoints:
  GET - https://xxxxxxxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/hello
functions:
  hello: serverless-typescript-sample-dev-hello
layers:
  None
✨  Done in 5.00s.

こんな感じでデプロイ無事成功❗
この画面では指定したステージとリージョンになっていることとはわかりますが、どのプロファイル使ったかまでは表示されないです。

ただ、指定のプロファイルがある環境でLambdaを確認したらこんな感じでデプロイされてます❗

ステージごとに環境変更

やり方はいろいろあるんだけど・・・結局こんな感じに落ち着きました。

provider:
  name: aws
  runtime: nodejs8.10
  region: ap-northeast-1
  stage: ${opt:stage, self:custom.defaultStage}
  profile: ${self:custom.profiles.${self:provider.stage}}
custom:
  defaultStage: dev
  defaultRegion: ap-northeast-1
  profiles:
    dev: serverless
    prd: serverless_prd

opt:stageでデプロイコマンドにstageオプションをつけることが出来ます。
オプションがなければself:custom.profiles.defaultStageが呼ばれます。
self:serverless.yml内を指してるので、defaultStagedevになります。

profile: ${self:custom.profiles.${self:provider.stage}}も同様に、serverless.yml内のcustom.profiles.を呼んで、その先を可変にしてます。
可変部分はprovider.stageなので、今回はdevが入ります。

結果、プロファイルはserverlessが呼ばれるって感じですね!

次はコマンドをstageオプション付きで実行しました。

yarn sls deploy --stage prd
yarn run v1.15.2
$ /Users/hisayuki/vscode/serverless-typescript-sample/node_modules/.bin/sls deploy --stage prd
Serverless: Bundling with Webpack...
Time: 1397ms
Built at: 2019/04/17 21:22:03
         Asset      Size  Chunks             Chunk Names
    handler.js  33.5 KiB       0  [emitted]  handler
handler.js.map   170 KiB       0  [emitted]  handler
Entrypoint handler = handler.js handler.js.map
 [0] ./node_modules/source-map/lib/util.js 12.6 KiB {0} [built]
 [1] ./node_modules/source-map/lib/source-map-generator.js 14 KiB {0} [built]
 [2] ./node_modules/source-map/lib/base64-vlq.js 4.6 KiB {0} [built]
 [3] ./node_modules/source-map/lib/array-set.js 3.12 KiB {0} [built]
 [4] ./handler.ts 297 bytes {0} [built]
 [5] ./node_modules/source-map-support/register.js 25 bytes {0} [built]
 [6] ./node_modules/source-map-support/source-map-support.js 17.6 KiB {0} [built]
 [7] ./node_modules/source-map/source-map.js 405 bytes {0} [built]
 [9] ./node_modules/source-map/lib/mapping-list.js 2.28 KiB {0} [built]
[10] ./node_modules/source-map/lib/source-map-consumer.js 39.6 KiB {0} [built]
[13] ./node_modules/source-map/lib/source-node.js 13.5 KiB {0} [built]
[14] external "path" 42 bytes {0} [built]
[15] external "fs" 42 bytes {0} [optional] [built]
[16] ./node_modules/buffer-from/index.js 1.56 KiB {0} [built]
[17] external "module" 42 bytes {0} [optional] [built]
    + 3 hidden modules
Serverless: Packaging service...
Serverless: Creating Stack...
 
  Error --------------------------------------------------
 
  Profile serverless_prd does not exist
 
     For debugging logs, run again after setting the "SLS_DEBUG=*" environment variable.
 
  Get Support --------------------------------------------
     Docs:          docs.serverless.com
     Bugs:          github.com/serverless/serverless/issues
     Issues:        forum.serverless.com
 
  Your Environment Information ---------------------------
     OS:                     darwin
     Node Version:           11.12.0
     Serverless Version:     1.40.0
 
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

まだserverless_prdのプロファイルは作っていないのでエラーになりますが、ちゃんと切り替わっていることはわかります❗

まとめ

今日は環境切り替えのためのserverless.ymlの書き方をやりました。
最初の環境変数にAWS_ACCESS_KEY_IDとAWS_SECRET_ACCESS_KEYが設定されてるとprofileを無視されてるにはハマりました・・・・(;´∀`)

コメント