こんにちは、AWS 認定インストラクターのたかやまです。
ありがたいことに弊社では、多くの企業様の新入社員研修を担当させていただいています。
こうしたトレーニングの中には、ビジネスマナーやメールの書き方などを学ぶヒューマンスキル系のコースも当然のことながら有りますが、ITシステムの開発や運用・ネットワークやLinuxの基礎知識を学ぶことができるコースも含まれており、演習環境を用いた実装演習が含まれているコースがほとんどです。
こうした演習環境を整備することも講師の仕事に含まれていますが、毎回手作業で作業するには量が多すぎます。なによりも、イメージファイルをもとに仮想環境に構築するからと言っても、人が手作業でおこなうことによるミスの発生と手戻り、その確認作業が大変です。
そこで、AWS Cloud Development Kit (CDK) を使って VPC ネットワークの作成や EC2 インスタンスの作成、Route 53 を使ったドメイン名の管理までひとまとめに構築できる環境を作りました。
この記事では、AWS CDK を使って環境構築を自動化した際に気をつけるべき点とCDK を選択した理由について説明します。
そもそも、AWS CDK とは何でしょうか。
AWS CDK は、Python や TypeScript など既存の開発言語を用いて AWS の環境構築をコードで記述することができる仕組みです。
使い慣れた開発言語が利用できる点や、ループや条件式などを利用できるため、CloudFormation のテンプレートよりも柔軟な記述が可能になります。
今回の環境構築に際して AWS CDK を採用した理由は次のとおりです。
以上のことから CDK をもとにした環境構築の自動化を行うことにしました。
今回作成した新入社員研修向け演習環境は、OS や ネットワーク、データベースやプログラミングといったひと通りの研修を受けたあとに行われる総合演習で使う環境です。
総合演習は、作るべきシステムのお題を受講者に提示し、プロジェクト管理から開発までを実際に行っていく研修です。データベースに MySQL を利用したウェブアプリケーションがテーマとなっています。
構成自体は非常にシンプルで現場によくありそうな環境です。研修の中ではネットワーク構築と管理、セキュリティ設計は範囲外となっているので、色々と割愛されています。
今回は、受講者数150名に対して AP サーバーと DB サーバーをそれぞれ1台ずつと、30名あたりで1台の踏み台サーバーを用意します。また、各サーバーは基本的に SSH で接続してもらいますが、何かあったときのために Systems Manager で色々確認できるように IAM ロールを設定します。
ということで、まとめると以下の要素を作成します。
思いの外ありますが、それぞれループで回せばいいので楽ちんです。
上記リソースを作成する CDK のコードを書くこと自体は大したコード量ではないですし、難しいことはないです。しかし、AWS には、サービスごとに超えられない制限が用意されています。
今回は、「1つの CloudFormation スタックで作成できるリソースの数は500まで」というどうにもならない壁がありました。
壁を超えることはできないので、AP サーバーとDBサーバー、踏み台サーバー、その他の3つのスタックに分割することにしました。CDK でネストされたスタックにするには、NestedStack を継承したクラスとして実装し、該当するクラスインスタンスを呼び出すだけです。
これで、スタックごとに作成できるリソース数の壁を通過することができました。
しかし、問題はこれだけではありません。AWS の API には、大量のリクエストを送ったときにレート制限が掛かり、API の実行が失敗してしまいます。
これに対応するには、じっくりコトコト API を呼び出すか、レート制限に引っ掛からない範囲で実行するしかありません。
ということで、1つのスタックで受講者10名分の環境を構築するようにして、細かくスタックを分けて時差を発生させて構築されるようにすることで逃げました。
こうした出来事がコース開始前日の午後から夜中にかけて発生していました。症状はわかりやすいエラーだったので、急いでコードを書き換えて対応することで朝までには環境を準備することができました。
今回の反省点として、AWS Well-Architecting Framework の中でも言われている本番スケールでのテスト不足が挙げられます。大事なことです。
また、いまの CDK は、CloudFormation で行えるすべての操作をコードにすることは難しく、既存のリソースに対する処理をおこなうことがリソースによってはできないことがあります。
たとえば、Route 53 のプレイベートホストゾーンに対して 新規作成した VPC を割り当てることができませんでした。具体的には、既存の Route53 リソースを fromXXX メソッドで読み込むことはできますが、HostedZone クラスの addVpc メソッドが呼び出せない。ということでした。
何かいい方法をご存じの方がいたら、たかやままで教えてください。
今回は、構築後に手動操作することで運用カバーしました。
AWS CDK を利用することで、300台を超えるインスタンスとその関連リソースをまとめて作成し、廃棄する仕組みが作れました。CloudFormation のテンプレートを直接書くよりも遥かに短い時間で準備できました(最初のコード自体は実質2日程度で作成)。
しかし、CDK 特有の問題もありますし、CloudFoamtion は AWS API の制限に引っ掛からないことを事前に確認するために本番スケールでテストをしましょう。クラウドのメリットは、実証実験をすぐにおこない、すぐに撤収させることができるのですから。
トレノケートのAWS認定トレーニングでは、AWS社の厳格なテクニカルスキル及びティーチングスキルチェックに合格した認定トレーナーがコースを担当します。AWS初心者向けの研修や、AWS認定資格を目指す人向けの研修をご提供し、皆様のAWS知識修得のサポートをいたします。
・トレノケートのAWS研修(AWS認定トレーニング)はこちら
▼AWS初心者の方は、 AWS Cloud Practitioner Essentialsから!
座学中心の研修で、AWSを初めて学ぶ方や、営業などで提案に関わる方におすすめです。
「AWS Certified Cloud Practitioner」資格取得を目指す方の基礎知識修得にも最適です。
→ AWS Cloud Practitioner Essentials 詳細・日程はこちらから