こんにちは。西山です。
この1年間、社内で今後利用するIaC(Infrastructure as Code)の調査・選定を行ってきました。IaC自体は知っていましたがやっておらず、基礎知識を調べたり動画を見たりして情報収集するところからのスタートでした。
結果として、CloudFortmation → Terraform → AWS CDKという順で検証し、最終的にAWS CDKに落ち着きました。
AWS CDKに決定した理由は主に以下になります。
- 社内で実際に利用しているのが9割以上AWSであり、かつ今後他クラウド利用を拡大する方針が無いこと(CDK for Terraformを使わない理由)
- 今後社内の主要プログラミング言語となるTypeScriptをサポートしていること(AWS CDK自体がTypeScriptでつくられています)
AWS CDKを利用することで、IaC化すること自体の恩恵も受けることができますが、それ以外にも明示的に定義しない部分はAWSのベストプラクティスにのっとっていい感じにリソースを作成してくれるという恩恵もあります。
今回は全員がIaC未経験メンバーで、超短期でサーバーレスアプリケーション開発を行った経験についてシェアしたいと思います。
目次
どんなプロジェクトだったか
チームメンバー4名(私 + 他3名)で3週間弱でサーバーレスアプリケーション開発を行いました。私含めメンバーは全員AWS CDKの実務経験がなく、またTypeScriptについても経験がありませんでした。
アプリケーションは以下の要件を満たす必要がありました。
- 外部APIからリアルタイムデータを継続的に取得してDynamoDBに保存する
- DynamoDBに保存されたリアルタイムデータを画面に表示する
- より大きなヒストリカルデータを外部APIから取得し、CSV変換を行った上で画面からダウンロードできる
メンバー3名を、CDK担当、フロントアプリ担当、バックエンド担当に役割分担して作業をしてもらいました。
プロジェクト開始時のインプット
動画学習
最初にAWS CDKの概要とどういった感じで使用してリソースを作成できるのかのイメージを持ってもらうために動画学習から行いました。
これらの動画を見ることでAWS CDKのファンになると思います笑
AWS CDK で CI/CD つきの Web アプリを作ろう!開発風景を Live Coding でお届けします (DEV-04)
C2:AWS CDKでInfrastructure as Code 〜 インフラの構築・改善をもっと早く!
ワークショップ
プロジェクト開始時に、メンバー全員に以下のワークショップをやってもらいました。特に「TypeScriptの基礎から始めるAWS CDK開発入門」は、TypeScriptの基礎とAWS CDKの基礎を同時に学べるので非常に効率の良い教材だと思いました。
また、「TypeScriptの基礎から始めるAWS CDK開発入門」はEC2とRDSのVPC内リソースを構築対象としているのに対し、「AWS CDK Workshop」ではAPI GatewayとLambdaのサーバーレスを構築対象としており、どちらもよく利用するパターンを学習することができます。
TypeScript の基礎から始める AWS CDK 開発入門
全体構成図と設計におけるポイント
全体構成図は下記になります。
フロントアプリケーションはS3でReactのSPAをホスティング、CDNとしてCloudFrontを利用しています。
バックエンドは、API Gateway、Lambda、DynamoDBの基本的なAPI構成としています。LambdaはNodeJSで実装しました。
ECSではサービスを実行し、NodeJSのスクリプトから継続的に外部APIからリアルタイムデータを取得してDynamoDBへ保存しています。
CSVダウンロードについては、LambdaでCSV変換処理を行った後にS3へアップロードし、署名付きURLを発行してクライアントからダウンロードしています。
AWS上のリソースは、S3のReactのフロントアプリケーション、LambdaとECS上のNodeJSのバックエンドアプリケーションを含め、すべてCDKプロジェクトのリポジトリで管理し、CDKでデプロイしています。
そして実はこの構成、ほとんど動画学習で視聴したAWS CDK で CI/CD つきの Web アプリを作ろう!開発風景を Live Coding でお届けします (DEV-04)と同じ構成です。
良かったこと
再利用可能なインフラコード
AWS CDKでインフラをIaC化することで、インフラが再利用可能になる点が素晴らしいですね。超短期でアプリケーション開発ができた背景には、動画学習でのリソースを参考にできたという点が大きいです。今後社内でCDKの活用が進んでいけば、ベースとなるCDKコードが増えてどんどん効率的に開発ができるようになるということでもあるので楽しみです。今まではマネジメントコンソールからポチポチ構築をしていましたが、慣れたらCDKのほうが早く正確に構築を行うことができると思います。
学習コストの低さ
AWSが公開している学習リソースや有志のブログなどのコンテンツが豊富にあって学習がしやすいというのもありますが、VSCodeでTypeScriptのAWS CDKを書くと、コード補完がガッツリきいているので細かい箇所が曖昧でもコードが書けてしまいます。書いたコードを元にデプロイを行い、調整したい部分はCDKのリファレンスを見ながら変更していくというやりかたがとてもやりやすいです。TypeScriptで書けるおかげでエラーも未然に防ぐことができますし、動くコードを正しく記述することができます。
構築手順書がいらない
お客様へ納品する際、構築手順書を納品することがありました。マネジメントコンソールから構築していたときは画面のスクリーンショットを撮って、何十枚ものドキュメントを書いていましたが、AWS CDKでIaC化されたプロジェクトであれば、それをどうデプロイするかのみをドキュメント化すれば良いです。
構築手順書を書き間違えるミス、構築手順書を元に構築した際に発生しうるミスもなくなるのでIaC化することはいいことづくしです。
つまづきポイントと注意するポイント
bootstrap時のCDKのバージョンについて
プロジェクトメンバー内でローカルのCDKのバージョンを合わせましょうという一般的なルールがあると思いますが、cdk bootstrap時のCDKバージョンについても注意する必要があります。cdk bootstrapはCDKを利用するときに一番最初に行うコマンドですが、このときのバージョンが古いものを利用していると、そのAWS環境でのみ不具合が発生するという事象が発生しました。その際、bootstrapで作成されるリソースを削除し、再度bootstrapを行うことで解決しました。
一見現在のローカルのCDKバージョンがそろっていてもデプロイに失敗する場合は確認してみてください。
スタック間、アプリケーション間でのリソース情報のやり取りとデプロイ手順
多くの人が最初に躓くポイントだと思います。特にフロントアプリケーションがある場合、フロントアプリケーション自体がAPIアクセスするバックエンドの情報を必要とするため、デプロイとビルドが少し複雑になります。
今回の構成だと以下の手順でデプロイを行う必要があります。
- cdk deployでバックエンドをデプロイ
- バックエンドの情報(API GatewayやCognitoの情報)をフロントアプリケーションに環境変数で伝える
- フロントアプリの再ビルド
- cdk deployでフロントアプリをデプロイ
ここでバックエンドリソースの中でリソース参照がCDK内で行われていないと、ここから更に複雑化していきます。例えば、LambdaにDynamoDBのテーブル情報をデプロイ後に.envファイルで伝えようとする場合、バックエンドも複数回に渡ってデプロイを行う必要が出てきます。
デプロイするときの手順も考慮して、極力スタック間でリソースを参照できるように設計するのが良いと思います。
スタックの分け方については様々なやり方があり、一概にどれが最善という方法は無いようです。今後CDKを利用していく中でやり方を確立していきたいですね。
これから社内でAWS CDKを導入しようと思っている方へ
超短期のプロジェクトでも、ベースとなるCDKサンプルがあれば導入することができました。IaCはハードルが高いと思われている方もいると思いますが、そういった方こそ上記の動画学習やワークショップをやってみて、CDKが簡単に始められるということを体験していただければと思います。
一度やってみれば手動で構築したくなくなること間違いなしだと思います!
また、IaCは社内へ波及し、みんなが使えるようになることが重要です。ギークフィードではNotionを利用しているので、その中にAWS CDKナレッジベースを作成して、社内の全員が始めやすいようにナレッジを共有しています。参考にしてみてください。
エンジニア採用を行っています。
ギークフィードではハイレベルなクラウドエンジニア(を目指している人含む)を随時募集しています。
量より質を重視する企業理念の関係上、採用合格率は決して高くありませんが、我こそはと思う方はhttps://www.geekfeed.co.jp/recruitment
よりご気軽にご応募ください!
- AWS Step Functionsの基本を再学習しました - 2024-09-23
- Amazon SESでバウンスメールを管理する - 2024-07-07
- TEAMをv1.1.1にアップデートしカスタムドメインを設定する - 2024-02-17
- コールセンター白書2023とAmazon Connect - 2023-12-25
- Provide dynamic and personalized CX with in-app web call for Amazon Connect - 2023-12-16