はじめに
TypeScript を使って Alexa Custom Skills を作ろうの番外編もこれで最後となります。(たぶん)
1月末にASK CLIがベータ版を抜けたので、ずっと眠らせてたASK CLIを利用したCI/CD環境の構築を2回に分けてご紹介します。
ASK CLI を使って Alexa Custom Skills をデプロイしよう (1) 設計 〜 環境構築
ASK CLI を使って Alexa Custom Skills をデプロイしよう (2) buildspec作成 〜 デプロイ
前提
- TypeScriptを使っていること
- 既にカスタムスキル、Lambdaファンクション(us-east-1)が作成済みである。
ASK CLI
Alexa Skills Kit Command Line Interfaceの略です。
コマンドラインでカスタムスキルの操作(作成、デプロイ、参照などなど)ができます。
ASK CLIを使ってCI/CD環境を作ってしまおうというのが本投稿の目的です。
ASK CLIの課題
これから使っていこうってところで先に課題を書いてしまいます。
ちなみに私は以下の理由により、ask deploy
によるデプロイは採用を見送っています。
- Lambdaファンクションのリージョンを指定してデプロイできない
- Lambdaのバージョニングとエイリアスが指定してデプロイできない
ベータ版
特に2つ目については、かなり致命的だと思ってます。
1スキルはLiveとDevバージョンで構成されますが、DevのLambdaをそのまま更新してしまうとLiveに影響を与えてしまう可能性があります。
事前に手動でバージョニング、エイリアス設定を行えば回避できるでしょうが、それをやってしまうと本来やりたかったところが出来てないよね。そこも含めて自動化したいところです。
そんなことを考えつつも、そこらへんも含めて共有したいなぁと思って書いてます。
(ドキュメント見落としてる可能性もあるかもしれませんが。。。)
CI/CDについて
簡単に言うと、コンピュータに任せられるとこはどんどん自動化して時間を節約しましょうってところでしょうか。
他のサイトでもっと詳しく正確な情報がある為、本投稿では細かい説明は割愛します。
参考
継続的インテグレーション(CI) - aws.amazon.com
継続デリバリー(CD) - aws.amazon.com
必要なもの
インストール、アカウント作成方法等は、本投稿では割愛いたします。
- Node.js 4.5以上
- Node Package Manager(npm)
- AWS CLI
- ASK CLI
- Amazon Developer アカウント
- AWS アカウント
- LWA(Login With Amazon) 認可
- AWS 資格情報(アクセスキー)
以前投稿した TypeScript を使って Alexa Custom Skills を作ろう (2) 環境構築 でASK CLI
のインストールも行っているので参考にしてください。
手動によるデプロイについて考える
CLIを使わずに、デプロイする場合を考えてみましょう。
- ソースをローカルPCにクローンする。
- 依存解決する。(npm install)
- トランスパイルする。(tsc)
- 単体テストする。
- ソースファイルをZIP圧縮し、デプロイパッケージを作成する。
- AWSマネジメントコンソールにログインする。
- Lambdaにデプロイパッケージをアップロードする。
- Amazon Developer Consoleにログインする。
- ASK Developer Consoleでカスタムスキルのスキル構成情報を更新する。
以上の内容を図にするとこんな感じです。
この方法ではいくつか課題があります。
- Lambda/スキル構成情報を別々に適用する為、一時的にバージョンが同期されない。
- 適用が手動の為、オペミスが発生しやすい。
- デプロイパッケージを準備をする為に、担当者毎に環境構築する必要がある。
- とにかく毎回やるのがつらみ
こういう面倒なルーチンワークは自動化をしてしまいましょう。ずっと手動で続けるのツライよ。。。
ASK CLIを使う構成を考える
何をトリガーにして自動化を行うかはいくつか候補がありますが、本投稿ではGitHubのstaging
ブランチへのプッシュをトリガーにします。
フローはこんな感じです。
- ソースをローカルPCにクローンする
- ソースの変更をプッシュする。
- GitHubのプッシュをトリガーにCodePipelineが起動する。
- CodeBuild起動。
- ASK CLI インストールする。
- AWS CLI コンフィグ設定する。
- 各種設定ファイルを準備する。
- 依存解決する。(npm install)
- トランスパイルする。(tsc)
- デプロイする。(ask deploy)
以上の内容を図にするとこんな感じです。
CI/CD環境をつくろう
では、環境作成を進めていきましょう。
CodePipelineの作成
ステップ1
ステップ2
ステップ3
ステップ4
ステップ5
ステップ6
完成!
初回は必ず失敗します。
ビルド仕様で選択したbuildspec.yml
を作成していない為です。
CodeBuildのビルド仕様について考える
パイプラインを作成したので、あとはプッシュ後のビルドについて考えます。
AWS CodeBuild のビルド仕様に関するリファレンス
前提条件
ASK CLIを使ってデプロイを実行するためには、以下が必要になります。
- Login With Amazon 認可トークン
- AWSアカウントの資格情報(アクセスキー)
前項で説明したフロー図では既に組み込んでいますが、設計する上で重要なことがあります。
機密情報、特に AWS アクセスキー ID とシークレットアクセスキーを格納する場合には、環境変数を使用しないことを強くお勧めします。環境変数は、AWS CodeBuild コンソールや AWS CLI などのツールを使用してプレーンテキストで表示できます。機密情報については、このセクションの後半で説明するように、parameter-store マッピングを代わりに使用することをお勧めします。
Parameter Storeは必ず使いましょう
Parameter Storeは必ず使いましょう
パラメータストアに格納する情報は以下の4つです。
- LWA アクセストークン
- LWA リフレッシュトークン
- AWS アクセスキー
- AWS シークレットキー
上記とは別にインパクトが小さいものは環境変数を利用します。
これらもASK CLI設定に必要です。
- ベンダーID
- スキルID
- Lambdaファンクション名
ビルドフェーズ
CodeBuildには以下の4つのフェーズがあります。
それぞれのフェーズに合わせてやることを設定します。
フェーズ | 概要 | やること |
---|---|---|
install | インストール | ask-cliインストール |
pre-build | ビルド前処理 | AWSCLI設定、ASKCLI設定 |
build | ビルド処理 | 依存解決、トランスパイル |
post-build | ビルド後処理 | ごみファイル掃除、デプロイ |
パラメータストアを作成する
まずは、パラメータを暗号化する為のキーを作成しましょう。
IAM Management Console -> 暗号化キーで以下のキーを作成します。
- リージョン:
東京リージョンus-east-1(バージニア北部) - エイリアス:AlexaEncryptionKey
パラメータの作成
EC2 Management Console -> System Manager 共有リソース -> パラメータストアで以下のパラメータを作成します。
名前 | 種類 | キーID |
---|---|---|
alexa-aws-access-key-id | SecureString | alias/AlexaEncryptionKey |
alexa-aws-secret-access-key | SecureString | alias/AlexaEncryptionKey |
alexa-lwa-access-token | SecureString | alias/AlexaEncryptionKey |
alexa-lwa-refresh-token | SecureString | alias/AlexaEncryptionKey |
CodeBuildロールポリシーの編集
CodeBuildで作成した暗号化キー、パラメータを読取りできるようにCodeBuildへ割り当てられているロールへポリシーの追加を行います。
{
"Effect": "Allow",
"Action": [
"ssm:GetParameters"
],
"Resource": [
"arn:aws:ssm:us-east-1:{account-id}:parameter/alexa-aws-access-key-id",
"arn:aws:ssm:us-east-1:{account-id}:parameter/alexa-aws-secret-access-key",
"arn:aws:ssm:us-east-1:{account-id}:parameter/alexa-lwa-access-token",
"arn:aws:ssm:us-east-1:{account-id}:parameter/alexa-lwa-refresh-token"
]
},
{
"Effect": "Allow",
"Action": [
"kms:Decrypt"
],
"Resource": [
"arn:aws:kms:us-east-1:{account-id}:key/alias/AlexaEncryptionKey"
]
}
もう一息
CodeBuild環境変数の設定
ASK CLI設定に必要な情報を環境変数へ以下の通り追加します。
名前 | 値 | タイプ |
---|---|---|
ALEXA_VENDOR_ID | {使用しているベンダーID} | プレーンテキスト |
ALEXA_SKILL_ID | {使用しているスキルID} | プレーンテキスト |
AWS_LAMBDA_FUNCTION_NAME | custom-skill-sample-to-convert | プレーンテキスト |
以上で環境構築は終わりです。
まとめ
本投稿では、以下のことを行いました。
- ASK CLIを使ってどうデプロイしていくか
- 環境構築
- CodePipeLine
- 暗号化キー
- パラメータストア
- CodeBuild
次回はCodeBuildのビルド仕様に沿って、buildspec.ymlを作成しデプロイまでを行います。