Amazon Web Services ブログ
AWS CloudFormation にアプリケーション全体をインポート
AWS 上で Infrastructure as Code (IaC) を利用することで、インフラストラクチャがスケールするように管理、モデリング、プロビジョニングできます。AWS CloudFormation を使えば YAML や JSON でコードとしてインフラストラクチャを宣言できます。一般的なプログラミング言語を使って AWS Cloud Development Kit (CDK) を利用することもできます。Application Composer で視覚的に管理することもできます。IaC 化されたリソースは、選択したバージョン管理システムで監査およびバージョン管理ができます。また、AWS CloudFormation を使ってデプロイすることで、変更セット を使ったデプロイプレビュー、自動ロールバック、Hooks を使ったリソースコンプライアンスのプロアクティブな適用などが可能になります。非常に多くのお客様が、AWS 上で IaC による安全性と信頼性の恩恵を受けています。
すべてのリソースが IaC で作成されるわけではありません。お客様はさまざまな理由で IaC 管理外のリソースを作成しています。IaC を知らなかったり、CLI やマネジメントコンソールで作業することを好む場合もあります。2019 年に、既存のリソースを CloudFormation にインポートする機能を発表しました。この機能は個々のリソースを IaC に取り込むうえでもはや必要不可欠ですが、デプロイ済みのリソースに合わせて手動でテンプレートを作成するプロセスは理想的ではありませんでした。お客様はリソースのドキュメントを調べ、パラメーターを手動でコピーする必要がありました。また、お客様はこれまで関連するリソースのグループとしてアプリケーションを扱っており、個々のリソースを扱うことはその経験と合致しないとのフィードバックもいただいています。そこで、リソースと関連するリソースをより包括的に管理する仕組みの作成に取り組むことにしました。
先日、リソースと関連するリソースに対して IaC のテンプレートを作成し、一貫した体験を実現する IaC ジェネレーター と CDK Migrate を発表しました。 これは、AWS アカウントをスキャンし、CloudFormation リソースタイプスキーマ を使用してリソース間の関連情報を見つけることで機能します。 テンプレートが作成されると、既存のスタックにそれらのリソースをインポートするか、ゼロから完全に新しいスタックを作成するかのどちらかを選択できます。 リソースを再作成する必要はなく、アプリケーション全体を CloudFormation スタックで管理できるようになりました!
このブログでは、IaC ジェネレーター が解決する一般的なユースケースを紹介します。IaC ツールの外で作成された既存のネットワークアーキテクチャを CloudFormation で管理します。
IaC ジェネレーターの活用
次のシナリオを考えてみましょう:
クラウド活用のプロセスを始めたばかりの組織に新入社員として入社し、チームの共有 Amazon Virtual Private Cloud (VPC) リソースの開発を継続するタスクが課せられました。 これらのリソースは現在、開発チームによってアクティブに使用されています。 調べてみると、これらのリソースは IaC を利用せずに作成されたことがわかりました。 ドキュメントはなく、セットアップした人はもうチームにいません。 問題をより複雑にしているのは、サブネット、ルートテーブル、インターネットゲートウェイなどの関連リソースを含む複数の VPC があることです。
あなたは IaC のメリットである再現性、信頼性、監査可能性、安全性を理解しています。 これらのリソースを CloudFormation の管理下に置くことで、既存のリソースにもこれらのメリットが適用されます。 以前にもリソースを CloudFormation にインポートしたことがあるので、テンプレートを作成するために、関連するすべてのリソースを手動で見つける作業に取りかかります。しかし、すぐにこれは簡単な作業ではないことがわかりました。 VPC には他のリソースとの関連情報は保存されていません。その代わりに、関係性は逆になっています。リソースは自身が紐付く VPC を知っていますが、VPC は自身に紐付いているリソースを知りません。 VPC に関連するすべてのリソースを見つけるには、VPC 関連のすべてのリソースを手動で確認し、それらが属している vpc-id
をスキャンする必要があります。 存在を認識していなかったり、異なるサービスのリソースであったりするためにリソースを見落としやすいので、注意深く確認する必要があります。 たとえば、Elastic Network Interface (ENI) を使用して VPC にアタッチするリソースもあります。Amazon Relational Database Service インスタンスなどがそうです。
しかし、あなたは最近 IaC ジェネレーターのことを知りました。 このジェネレーターは、アカウントのスキャンを実行してリソースの最新のインベントリを作成することで機能します。 CloudFormation は、リソースタイプスキーマを利用して、リソース間の関係性を見つけます。 たとえば、サブネットは vpc-id
プロパティ経由で VPC との関係があると判断できます。 これらの関係性が決定されると、テンプレートを生成したいトップレベルのリソースを選択できます。 最後に、ウィザードを利用して、この既存のテンプレートからスタックを作成できます。
マネジメントコンソールの IaC ジェネレーターページに移動し、アカウントでスキャンを開始できます。スキャンは 30 日間有効で、1 つのアカウントで 1 日に 3 回スキャンを実行できます。
スキャンが完了すると、テンプレートを作成 ボタンを選択してテンプレートを作成します。新しいテンプレートから開始 を選択した後、テンプレート名 やスタックポリシーなど、スタックに関する詳細を入力します。ここでは、Retain
(保持) のままにします。
次のページでは、スキャンされたすべてのリソースが表示されます。タグなどのフィルタをリソースに追加して、スキャンされたリソースのサブセットを表示できます。この例では、Resource type prefix
フィルタのみを使用します。フィルタの詳細については、こちらをご覧ください。VPC を見つけたら、リストから選択できます。
次のページでは、CloudFormation がこの VPC とリンクしていると判断したリソースのリストが表示されます。
これには、さまざまなネットワーク関連リソースが含まれていることがわかります。
これらすべてのリソースを選択した状態でテンプレートを作成します。
この時点で、テンプレートを作成 を選択すると、CloudFormation が既存のリソースからテンプレートを生成します。 これらのリソースをインポートする既存のスタックがないため、新しいスタックを作成する必要があります。 ここでこのテンプレートを選択し、スタックにインポート ボタンを選択します。
スタック名 を入力した後、テンプレートが必要とする パラメータ を入力できます。
CloudFormation は、新しいスタックの変更セットを作成します。変更セットを使用すると、CloudFormation がスタックに適用する変更を確認できます。この例では、すべてのリソースが Import
ステータスになります。CloudFormation が見つけたリソースが表示され、スタックを作成できます。
この時点で、スタックの作成操作は通常通り進み、各リソースをインポートしてスタックに取り込んでいきます。ネットワークスタック全体を正常にインポートできたことをチームに報告できます!次のステップとして、このテンプレートをバージョン管理システムでソース管理する必要があります。 私たちは先日、CloudFormation テンプレートを一般的なバージョン管理システムと同期 できる新機能を発表しました。 最後に、ドリフトを避けるために、CloudFormation を通じて変更を行うことを確認してください。
この例は主に CloudFormation ベースでしたが、CDK を利用されている方は CDK Migrate を使用して、この構成を CDK アプリケーションにインポートできます。
すぐにご利用いただけます!
IaC ジェネレーターは、CloudFormation がサポートされているすべてのリージョンで現在利用可能です。コンソール、CLI、SDK を使用して IaC ジェネレーターにアクセスできます。
おわりに
このブログでは、CloudFormation の新しい IaC ジェネレーター機能を紹介しました。以前に存在していたリソースを管理する必要があるシナリオを辿り、IaC ジェネレーターの提供する手順に従って CloudFormation テンプレートを生成しました。次に、そのテンプレートを使用してスタックを作成し、これらのリソースを管理しました。 これらのリソースは、IaC が提供する安全性と反復可能性の恩恵を受けることができるようになりました。これはひとつの例に過ぎませんが、コンソールファーストの開発体験を可能にするなど、この機能の他のユースケースを想定しています。この機能についてのご意見をお聞かせいただけることを楽しみにしています。 ぜひ感想をお聞かせください!
本記事は、Dan Blanco による Import entire applications into AWS CloudFormation を翻訳したものです。翻訳はソリューションアーキテクトの山崎宏紀が担当しました。