IaCジェネレーターでテンプレートを作ってみた

    IaCジェネレーターでテンプレートを作ってみた

     

    目次

       

       

      本記事の内容

      本記事は、24卒のインターン生(Cloud未経験)が IaC についてまとめた記事です。

      簡単な AWS CloudFormation テンプレートを作り、2024/02/05 にリリースされた AWS CloudFormation IaC ジェネレーターを試しました。

      IaC とは何か、メリット・デメリット

      IaC(Infrastructure as Code)は、インフラストラクチャの構成をコード化し、構築、変更、削除などを自動化する手法の一つです。

      • メリット
        • 環境構築の手間や時間が削減可能
        • ヒューマンエラーの防止
        • 保守性の向上
        • 環境の複製が容易
      • デメリット
        • IaC ツールの導入に手間がかかる
        • 学習コストが高い

      IaC を実現するためのツールとして有名なものに Terraform があり、HashiCorp 社により提供されています。 Terraform は複数のクラウドサービスに対応していますが、AWS CloudFormation は AWS のみに対応しています。

      AWS CloudFormation とは何か

      AWS CloudFormation は、サーバーやネットワーク、ストレージといったシステム構築に必要な各リソースを、コードを元にして作成、変更、管理する機能を持っています。

      AWS CloudFormation は、JSON や YAML 形式で記述されたテンプレートファイルから、AWS リソースの環境を構築するサービスです。

      AWS CloudFormation は、定められた形式に従ってテンプレートファイルを記述します。そのファイルを AWS マネジメントコンソール上、または AWS コマンドラインインターフェイスから実行することができます。
      AWS のインフラ環境を構築する作業をコード化し、環境構築作業の迅速化、作業ミスの防止、再利用を実現します。

      AWS CloudFormation のメリットとして、AWS 上で AWS から提供されているためにツール導入や構築の手間がかからないという点があります。 今回はこの CloudFormation で、新しい機能が追加されたので試してみました。

      通常はコードを作成し、コードを利用してリソースを作成しますが、アップデートで、既にあるリソースからコードを生成できるようになりました。その結果、IaC のデメリットであるコード作成の学習コストの問題を軽減できると考えられます。

      AWS CloudFormation の使い方

      テンプレートテキストから、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のマネジメントコンソールを開きます。

      今回は新規でスタックを作成するので、「スタックの作成」をクリックします。

      create-a-template-with-the-iac-generator_01

       

      テンプレートの選択画面が表示されます。既存のテンプレートファイルを利用するので、「テンプレートファイルのアップロード」を選択します。「ファイルの選択」から先ほどのテンプレートを選び、次へ行きます。create-a-template-with-the-iac-generator_02

       

      スタックの名前を入力します。 「vpc」とします。
      create-a-template-with-the-iac-generator_03

       

      オプションは、デフォルトのまま次に進み、確認画面が表示されたら最後に作成をクリックします。
      create-a-template-with-the-iac-generator_04

       

      作成がはじまり、「CREATE_IN_PROGRESS」状態になります。
      create-a-template-with-the-iac-generator_05

       

      完了までに一分ほどかかりました。

      作られたかどうかはスタックのリソースで確認できます。
      create-a-template-with-the-iac-generator_06

      IaC ジェネレーターでテンプレートを作ってみた

      続いて、アップデートで追加された IaC ジェネレーターを試してみます。

      今回、テンプレート化するリソースはハンズオンAWS 上で静的な Web サイトを公開しよう!で作成した S3 のリソースです。

      CloudFormation のメニューとして「IaC ジェネレーター」が追加されています。
      create-a-template-with-the-iac-generator_07

       

      まず AWS リソースのスキャンを実施します。
      スキャンには下記のような制限があるため、スキャンはリソース数が少ないシドニーリージョンで実施しました。

      名前 Value
      1 回のアカウントスキャンで処理できるリソースの最大数 100000
      1 日あたりのスキャン数 (リソースが 10,000 未満のアカウントの場合) 3
      1 日あたりのスキャン数 (リソースが 10,000 以上のアカウントの場合) 1
      アカウントあたりの同時に生成されるテンプレートの数 5
      1 回のテンプレート生成で同時にモデル化されるリソースの数 5
      1 つのテンプレートでモデル化できるリソースの合計数 500

      IaC ジェネレーターの「新しいスキャンを開始」ボタンを押すとスキャンが開始されます。
      一度スキャンを開始するとキャンセルはできないため、注意してください。

      スキャン完了後、「テンプレートを作成」を押します。
      create-a-template-with-the-iac-generator_08

       

      次にテンプレート名をつけます。「myCloudFormationStack」とします。
      その他はデフォルトの設定のままです。

      create-a-template-with-the-iac-generator_09

       

      スキャンしたリソースからテンプレート化するリソースを選択します。
      リソース名、タグキー、タグ値、リソース識別子で絞り込むことができます。
      今回は作成した S3 のリソースのみを選択します。create-a-template-with-the-iac-generator_10

       

      選択したリソースについて、関連リソースがあれば自動検知してくれます。
      create-a-template-with-the-iac-generator_11

       

      確認画面で問題なければ「テンプレートを作成」ボタンをクリックします。 数分待つとテンプレートが生成されます。
      create-a-template-with-the-iac-generator_12


      作成したテンプレートは、IaC ジェネレーターの画面から確認できます。
      create-a-template-with-the-iac-generator_13

      テンプレートのインポート

      IaC ジェネレータでは、既存リソースのテンプレート化までを実施できました。

      インポートを行うことで、手動で構築したリソースを CloudFormation スタックの配下で管理できるようになります。
      つまり、CloudFormation から作成したリソースのように扱うことが可能になるということです。

      先程作成したテンプレートを選択し、「スタックにインポート」ボタンをクリックします。
      create-a-template-with-the-iac-generator_12

       

      まずスタック名を設定します。「CFnTest」とします。
      create-a-template-with-the-iac-generator_14


      パラメータはないので次に進みます。
      create-a-template-with-the-iac-generator_15


      スタックに取り込まれるリソースを確認することができます。
      create-a-template-with-the-iac-generator_16


      最後に「リソースをインポート」をクリックします。
      create-a-template-with-the-iac-generator_17


      インポートが完了すると、IMPORT_COMPLETE と表示されます。
      create-a-template-with-the-iac-generator_19

       

      スタックに S3 リソースが含まれていることが確認できます。
      create-a-template-with-the-iac-generator_20

      まとめ

      今回は AWS CloudFormation の IaC ジェネレーターがマネジメントコンソールでも使えるようになっていたので、試してみました。
      今回は CloudFormation を使いましたが、IaC ジェネレーターには cdk migrate コマンドを使用して、テンプレートを CDK アプリケーションに変換する機能もあります。
      AWS 上で既存のリソースのテンプレート化を実施できるようになりました、ぜひ試してみてください!

      【参考】

      IaC とは?IaC のメリットやデメリット、Terraform などの構成管理ツールの特徴を紹介

      Multi-cloud provisioning

      AWS CloudFormation

      既存のリソースのテンプレートを生成

      スタックへの既存リソースのインポート