本記事は、24卒のインターン生(Cloud未経験)が IaC についてまとめた記事です。
簡単な AWS CloudFormation テンプレートを作り、2024/02/05 にリリースされた AWS CloudFormation IaC ジェネレーターを試しました。
IaC(Infrastructure as Code)は、インフラストラクチャの構成をコード化し、構築、変更、削除などを自動化する手法の一つです。
IaC を実現するためのツールとして有名なものに Terraform があり、HashiCorp 社により提供されています。 Terraform は複数のクラウドサービスに対応していますが、AWS CloudFormation は AWS のみに対応しています。
AWS CloudFormation は、サーバーやネットワーク、ストレージといったシステム構築に必要な各リソースを、コードを元にして作成、変更、管理する機能を持っています。
AWS CloudFormation は、JSON や YAML 形式で記述されたテンプレートファイルから、AWS リソースの環境を構築するサービスです。
AWS CloudFormation は、定められた形式に従ってテンプレートファイルを記述します。そのファイルを AWS マネジメントコンソール上、または AWS コマンドラインインターフェイスから実行することができます。
AWS のインフラ環境を構築する作業をコード化し、環境構築作業の迅速化、作業ミスの防止、再利用を実現します。
AWS CloudFormation のメリットとして、AWS 上で AWS から提供されているためにツール導入や構築の手間がかからないという点があります。 今回はこの CloudFormation で、新しい機能が追加されたので試してみました。
通常はコードを作成し、コードを利用してリソースを作成しますが、アップデートで、既にあるリソースからコードを生成できるようになりました。その結果、IaC のデメリットであるコード作成の学習コストの問題を軽減できると考えられます。
テンプレートテキストから、CloudFormation スタックを作成してみます。
例として、VPC 関連のインターネットゲートウェイ、サブネット、ルートテーブル等を作成する場合には、以下のようなテンプレートを作成する必要があります。
AWSTemplateFormatVersion: '2010-09-09'
Resources:
FirstVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
Tags:
- Key: Name
Value: FirstVPC
InternetGateway:
Type: AWS::EC2::InternetGateway
Properties:
Tags:
- Key: Name
Value: FirstVPC-IGW
AttachGateway:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
VpcId: !Ref FirstVPC
InternetGatewayId: !Ref InternetGateway
FrontendRouteTable:
Type: AWS::EC2::RouteTable
DependsOn: AttachGateway
Properties:
VpcId: !Ref FirstVPC
Tags:
- Key: Name
Value: FirstVPC-FrontendRoute
FrontendRoute:
Type: AWS::EC2::Route
DependsOn: AttachGateway
Properties:
RouteTableId: !Ref FrontendRouteTable
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref InternetGateway
FrontendSubnet:
Type: AWS::EC2::Subnet
DependsOn: AttachGateway
Properties:
CidrBlock: 10.0.1.0/24
MapPublicIpOnLaunch: 'true'
VpcId: !Ref FirstVPC
Tags:
- Key: Name
Value: FirstVPC-FrontendSubnet
FrontendSubnetRouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref FrontendSubnet
RouteTableId: !Ref FrontendRouteTable
CloudFormationのマネジメントコンソールを開きます。
今回は新規でスタックを作成するので、「スタックの作成」をクリックします。
テンプレートの選択画面が表示されます。既存のテンプレートファイルを利用するので、「テンプレートファイルのアップロード」を選択します。「ファイルの選択」から先ほどのテンプレートを選び、次へ行きます。
スタックの名前を入力します。 「vpc」とします。
オプションは、デフォルトのまま次に進み、確認画面が表示されたら最後に作成をクリックします。
作成がはじまり、「CREATE_IN_PROGRESS」状態になります。
完了までに一分ほどかかりました。
作られたかどうかはスタックのリソースで確認できます。
続いて、アップデートで追加された IaC ジェネレーターを試してみます。
今回、テンプレート化するリソースはハンズオンAWS 上で静的な Web サイトを公開しよう!で作成した S3 のリソースです。
CloudFormation のメニューとして「IaC ジェネレーター」が追加されています。
まず AWS リソースのスキャンを実施します。
スキャンには下記のような制限があるため、スキャンはリソース数が少ないシドニーリージョンで実施しました。
名前 | Value |
---|---|
1 回のアカウントスキャンで処理できるリソースの最大数 | 100000 |
1 日あたりのスキャン数 (リソースが 10,000 未満のアカウントの場合) | 3 |
1 日あたりのスキャン数 (リソースが 10,000 以上のアカウントの場合) | 1 |
アカウントあたりの同時に生成されるテンプレートの数 | 5 |
1 回のテンプレート生成で同時にモデル化されるリソースの数 | 5 |
1 つのテンプレートでモデル化できるリソースの合計数 | 500 |
IaC ジェネレーターの「新しいスキャンを開始」ボタンを押すとスキャンが開始されます。
一度スキャンを開始するとキャンセルはできないため、注意してください。
スキャン完了後、「テンプレートを作成」を押します。
次にテンプレート名をつけます。「myCloudFormationStack」とします。
その他はデフォルトの設定のままです。
スキャンしたリソースからテンプレート化するリソースを選択します。
リソース名、タグキー、タグ値、リソース識別子で絞り込むことができます。
今回は作成した S3 のリソースのみを選択します。
選択したリソースについて、関連リソースがあれば自動検知してくれます。
確認画面で問題なければ「テンプレートを作成」ボタンをクリックします。 数分待つとテンプレートが生成されます。
作成したテンプレートは、IaC ジェネレーターの画面から確認できます。
IaC ジェネレータでは、既存リソースのテンプレート化までを実施できました。
インポートを行うことで、手動で構築したリソースを CloudFormation スタックの配下で管理できるようになります。
つまり、CloudFormation から作成したリソースのように扱うことが可能になるということです。
先程作成したテンプレートを選択し、「スタックにインポート」ボタンをクリックします。
まずスタック名を設定します。「CFnTest」とします。
パラメータはないので次に進みます。
スタックに取り込まれるリソースを確認することができます。
最後に「リソースをインポート」をクリックします。
インポートが完了すると、IMPORT_COMPLETE と表示されます。
スタックに S3 リソースが含まれていることが確認できます。
今回は AWS CloudFormation の IaC ジェネレーターがマネジメントコンソールでも使えるようになっていたので、試してみました。
今回は CloudFormation を使いましたが、IaC ジェネレーターには cdk migrate コマンドを使用して、テンプレートを CDK アプリケーションに変換する機能もあります。
AWS 上で既存のリソースのテンプレート化を実施できるようになりました、ぜひ試してみてください!
【参考】