本記事はAWS Advent Calendar 2018の24日目の記事になります。
やりたいこと
AWS re:Invent 2018で「AWS Amplify Console」なるものが発表された時、どの程度お手軽にデプロイが可能なのか、試したことがあります。
AWS Amplify Consoleがどれだけお手軽か試してみた所感
が、これはいわゆる「静的ページをデプロイ」してみたにすぎません。実際にはサーバレスアプリケーションみたいなものをデプロイしてみたいものです。(本記事にはAmplify Consoleは出てきません)上記前記事参照。
というわけで、上記を機能追加したアプリケーションをクライアント側とサーバ側に分けてデプロイしてみようと思います。ただし、本当にお手軽に行けるか、タイムトライアルで。
開始:17:30
ちなみに後述のCodeBuildは今回初利用です。
構成
- クライアントは前回と変わらず。Angular 6をベースとしたアプリケーション。いわゆる以前のAWS Amplify(JavaScript SDK)を利用しています。
- サーバ側はAPI Gateway + Lambdaといういわゆる一般的なサーバレスアプリ
何ができるアプリか?
こんな感じにCognitoのユーザ追加や承認処理を画面から行うための手抜きアプリです。(強制承認をしたい時にいちいちCLIからコマンド打つの面倒だよね、というモチベを元に、グループ変更とかまでしようとしている(開発中)アプリです)
-
クライアント側
https://github.com/kojiisd/aws-amplify-user-management/tree/0.1 -
サーバ側
https://github.com/kojiisd/lambda-cognito-user-manager/tree/0.1
【注意】
一応Cognito認証は通していますが、CORSは全OKにしているし、セキュリティ周りはガバガバなので、ご利用は計画的に。
デプロイ準備
クライアント側は以前実施しているのでスキップします。今回はサーバ側のデプロイをCodeBuildで管理してみます。これができれば、CodePipelineでトータルのビルド管理ができるようになるので、クライアント側と同様、GitHubへのコミットをトリガとしてテストやビルドを自動で通すことができるようになります。
ちなみに、当然サーバ側ビルド前に公開されているクライアントにアクセスしても、APIコールで失敗します。
サーバ側のデプロイ設定
特別な設定はしていませんが、OS:UbuntuでNode8系の環境を選択しました。buildspec.ymlも当然新規に作成(その場でエディット)です。
※最初Python環境を選択して1時間ほどハマりましたが、ビルド環境がPythonである必要は全くないことに気づき、Node環境に途中から切り替えました。
※Python環境で頑張っていた時の図。serverlessのインストールのためのnpm実行でハマりまくりました。
serverless.ymlの中に指定するUserPoolIdやCognitoのARNは、CodeBuildの環境変数を利用してビルド途中で置換しました。
これでなんとかビルドまで通りました。API Gatewayなどが無事出来上がりです。とっても楽チン。
version: 0.2
phases:
install:
commands:
- apt-get update -y
- npm install -g serverless
pre_build:
commands:
- sed -i -e "s|COGNITO_IDP_ARN|${COGNITO_IDP_ARN}|g" serverless.yml
- sed -i -e "s/USER_POOL_ID/${USER_POOL_ID}/g" serverless.yml
build:
commands:
- sls deploy
画面操作できるようになりました。
終了時刻:20:30
まとめ
3時間程度で(はまった時間があるとはいえ)サーバレス側のビルドとクライアント側への繋ぎこみなどが完了しました。もう少し効率化できたかもしれませんが、ぱっとの思いつきと勘でここまでできてしまうという点は、AWSのおそるべきところかと思います。
前回の記事と合わせて、これでクライアント側の高速なデプロイ&公開と、バックエンドのビルド自動化(トリガ設定すれば)が可能になりました。以前書いた記事のAWS Amplify Consoleも2時間程度で設定できてしまったので、トータル1日以内でクライアントとサーバのデプロイ、および公開ができてしまう時代なのは嬉しいですね。