AWS再入門2022 AWS CloudFormation編

弊社コンサルティング部による『AWS 再入門ブログリレー 2022』の2日目のエントリでテーマはAWS CloudFormationです。 色々な機能がありますのでおさらいしていきます。1つでも知らない機能があり、学びにつながれば幸いです。
2022.02.02

こんにちは、コンサル部のグム・サンウォンです。

当エントリは弊社コンサルティング部による『AWS 再入門ブログリレー 2022』の 2日目のエントリです。

このブログリレーの企画は、普段 AWS サービスについて最新のネタ・深い/細かいテーマを主に書き連ねてきたメンバーの手によって、 今一度初心に返って、基本的な部分を見つめ直してみよう、解説してみようというコンセプトが含まれています。

AWSをこれから学ぼう!という方にとっては文字通りの入門記事として、またすでにAWSを活用されている方にとってもAWSサービスの再発見や2022年のサービスアップデートのキャッチアップの場となればと考えておりますので、ぜひ最後までお付合い頂ければ幸いです。

では、さっそくいってみましょう。2日目のテーマはCloudFormationです。

今回のブログでは実際にCloudFormationを実施する内容もあるのでぜひ一度やってみてください!

CloudFormationとは?

開発や本運用に必要な、互いに関連する AWS およびサードパーティーのリソースコレクションを作成し、そのリソースを適切な順序に予測可能な方法でプロビジョニングおよび管理できるIaCサービスです。

料金

お支払いはお客様が実際に使用した分だけです。最低料金や前払いの義務や次のネームスペースにあるリソースプロバイダーを 使用する場合は、追加料金は発生しません。

(!注意点:(: AWS::、Alexa::、Custom::*)この場合は、AWS リソース (EC2など) に対しては、料金が発生します。)

無料利用枠

  • 無料利用枠 : アカウントごとに 1 か月で 1,000 のハンドラーオペレーション
  • ハンドラーオペレーション : ハンドラーオペレーションごとに 0.0009 USD *

料金 サードパーティーリソースプロバイダー (AWS::、Alexa::、Custom::* 以外)

  • 無料利用枠 : アカウントごとに 1 か月で 1,000 のハンドラーオペレーション
  • ハンドラーオペレーション : ハンドラーオペレーションごとに 0.0009 USD
  • ハンドラーオペレーション期間 : 1 秒あたり 0.00008 USD   

特徴

拡張性

AWS CloudFormation レジストを使用して、AWS パートナーネットワーク (APN) のパートナーおよびデベロッパーコミュニティによって公開されているサードパーティのリソースとモジュールを検出、プロビジョニング、および管理します。そして AWS CloudFormation CLI により、独自のリソースプロバイダーを構築できます。

クロスアカウント管理およびクロスリージョン管理

CloudFormation StackSets を使用すると、1 つの CloudFormation テンプレートで、複数のアカウントや複数のリージョン全体に共通の AWS リソースセットをプロビジョニングできます。

JSON/YAML によるオーサリング

お客様のクラウド環境全体をテキストファイルでモデルリングできます。JSON または YAML などのオープンソース宣言型言語を使用することで、作成、設定したい AWS リソースを記述できます。ビジュアルに設計はAWS CloudFormation Designer を使用すればできます。

使い慣れたプログラミング言語でオーサリングする

AWS CDKで、TypeScript、Python、Java、.NETのように慣れているログラミング言語を使用するクラウドアプリケーションリソースをモデルリングし、CloudFormation を IDE から直接使用して構築できます。

SAM でサーバーレスアプリケーションを構築する

SAMは簡潔な構文で関数、API、データベース、イベントソースマッピングを表現するオープンソースフレームワークのもので、リソースごとにわずか数行で、任意のアプリケーションを定義して YAML を使用してモデリングできます。

安全性制御

インフラストラクチャのプロビジョニングと更新が安全かつ制御された方法で自動化されます。 ロールバックトリガーを使用してスタック作成·アップデートプロセスを行う間、CloudFormationがモニタリングすべきCloudWatchアラートを指定し、トリガーされたアラートがある場合は、すべてのスタック作業を以前に配布された状態でロールバックします。

環境に対する変更点をプレビューする

AWS CloudFormation の変更セット機能で、スタックに対して提案された変更が実行中のリソースにおよぼす影響があるのかプレビューできます。

依存関係の管理

スタックオペレーションの実行の際には、CloudFormation によって正しいアクション順が決められるのでリソースを作成、更新、削除される順序を指定する必要はありません。

テンプレート

CloudFormation文書はYAMLとJSONで作成できますが、YAMLを使用すると文書に対する説明を追加できるので、AWSではYAMLをお勧めしています。

AWSTemplateFormatVersion: '2010-09-09'
Description: 'CloudFormation Template Test'
Resources:
  # VPC
    TestVPC:
      Type: AWS::EC2::VPC
      Properties:
        CidrBlock: '10.0.0.0/16'
        EnableDnsSupport: 'true'
        EnableDnsHostnames: 'true'
        InstanceTenancy: 'default'
        Tags:
        - Key: Name
          Value: 'test-vpc'

  # InternetGateway
    TestInternetGateway:
      Type: AWS::EC2::InternetGateway
      Properties:
        Tags:
          - Key: Name
            Value: 'test-igw'
    TestAttachment:
      Type: AWS::EC2::VPCGatewayAttachment
      Properties:
        VpcId: !Ref TestVPC
        InternetGatewayId: !Ref TestInternetGateway

  # Subnet
    TestPrivateSubnet:
      Type: AWS::EC2::Subnet
      Properties:
        AvailabilityZone: 'ap-northeast-1a'
        CidrBlock: '10.0.0.0/24'
        VpcId: !Ref TestVPC
        Tags:
          - Key: Name
            Value: 'test-private-subnet'
    TestPublicSubnet:
      Type: AWS::EC2::Subnet
      Properties:
        AvailabilityZone: 'ap-northeast-1c'
        CidrBlock: '10.0.1.0/24'
        VpcId: !Ref TestVPC
        Tags: 
          - Key: Name
            Value: 'test-public-subnet'

  # RouteTable
    TestPublicRouteTable:
      Type: AWS::EC2::RouteTable
      Properties:
        VpcId: !Ref  TestVPC
        Tags:
          - Key: Name
            Value: !Sub  test-public-rtb

    TestPublicRoute:
      Type: AWS::EC2::Route
      Properties:
        RouteTableId: !Ref  TestPublicRouteTable
        DestinationCidrBlock: 0.0.0.0/0
        GatewayId: !Ref  TestInternetGateway

  # Subnet to attach
    TestPublicSubnetRouteTableAssociation:
      Type: AWS::EC2::SubnetRouteTableAssociation
      Properties:
        SubnetId: !Ref TestPublicSubnet
        RouteTableId: !Ref TestPublicRouteTable

今回のブログで例として使われるテンプレートは簡単にVPCを構築する内容で準備しました。テンプレートを見ながら説明します。

AWSTemplateFormatVersion

AWSTemplateFormatVersion セクション (任意) は、テンプレートの機能を識別します。最新のテンプレートの形式バージョンは 2010-09-09 であり、現時点で唯一の有効な値です。

Description

文字列でテンプレートの説明の書きます。

Resources

必須の Resources セクションでは、スタックに含める AWS リソースを宣言します。

論理ID

英数字(A-Za-z0-9)で書くテンプレート内で固有のIDです。論理IDはテンプレート内のリソースを参照する時に使われます。(例:TestVPCInternetGateway

Type

リソースタイプとは「何を作るか」の種類の指定の事です。

Properties

プロパティは具体的な設定をします。サービスで指定します。設定項目はリソースタイプによって項目が違います。

例えば、「Subnet」には「AvailabilityZone」、「CidrBlock」、「VpcId」、「Tags」がプロパティです。

組み込み関数

今回使った!Refは、指定されたパラメータまたはリソースに関する情報を返却できます。例えば「Subnet」を作る時、「VPC ID」が必要となりますが、同じテンプレートで作られるため、「VPC ID」が分からないです。でもスタックを作成するとYAMLファイルの内容の順番通りに構築されるのでVPCがSubnetより先に作られます。それで!Refを使うとVPCの情報を返却するので「VPC ID」を設定できます。

色んな組み込み関数

他の組み込み関数に関しては下のブログを参考してください。

CloudFormation実行

上のテンプレートのコードをコピーしてYAMLファイルを作ります。

「スタックの作成」をクリックします。

スタックとは?

単一のユニットとして管理できる AWS リソースのコレクションです。つまり、スタックを作成、更新、削除することで、リソースのコレクションを作成、更新、削除できます。

「テンプレートの準備完了」を選択します。そして「テンプレートファイルのアップロード」を選択してからYAMLファイルをアップロードします。下の「次へ」をクリックします。

スタックの名前を入力して「次へ」をクリックします。

必要な「タグ」を入力します。そして下でYAMLファイルが間違った場合、「すべてのスタックリソースをロールバックする」「正常にプロビジョニングされたリソースの保存」するかを選択します。

詳細オップションの設定が必要な場合は設定して「次へ」をクリックします。

「スタックの作成」をクリックしてスタックの作成します。

無地に作成できたら「リソースのタブ」「リソースの物理ID」をクリックして確認します。

CloudFormarion 機能

変更セット

スタックを更新する必要がある場合は、変更の実装前に実行中のリソースに与える影響を理解することで、スタックを変更案のまま続行するか別の変更セットを作成して他の変更を検討するかを決定できます。

ドリフト検出

ドリフト検出を使用して、CloudFormation 管理外で設定変更がされたスタックリソースを識別できます。その後、スタックリソースがスタックテンプレート内の定義と再度同期するように是正措置を行うことができます。

スタックセット

スタックセットを使用すると、一つのAWS CloudFormationテンプレートを使用して複数リージョン、複数のAWSアカウントにスタックを作成できます。

(!注意点:1つのリージョンでスタックを作った場合、他のリージョンでスタックを見たり、変更することはできません。)

既存リソースの取り込み

管理外の AWS リソースを作成した場合「resource import」 を使用してリソースを削除してスタックの一部として再作成しなくても、作成された場所に関係なく AWS CloudFormation を使用して管理できます。

AWS CloudFormation デザイナー

初心者でもAWS CloudFormation テンプレートを作成、参照、および変更するためのグラフィックツールです。デザイナー を使用すると、ドラッグアンドドロップインターフェイスを使用してテンプレートリソースを図示し、統合された JSON および YAML エディタ を使用して詳細を編集できます。

AWS CloudFormation デザイナーツール

正常にプロビジョニングされたリソースの保存

CloudFormationでスタックを実行する時、エラーが発生すると全てのリソースを削除する自動ロールバックを無効化し、エラーが発生する前に成功的に構築されたりアップデートされたリソースを維持して、失敗地点でスタック作業を再試行することができます。

AWS CDK用アーキテクチャパターンライブラリ

お気に入りのプログラミング言語とAWS CloudFormationを使用してリソースをプロビジョニングして、コードとしてのインフラ管理ができます。

CloudFormationの変換ツール

AWSが公開している「aws-cfn-template-flip」は、AWS CloudFormationテンプレートをJSON形式とYAML形式に変換することができます。また、AWSで公開されているので安心して使うことができます。

CloudFormationの長所・短所

長所

  • コードで管理できる
    どんな作業をやったがをコードで伝えることで情報共有がしやすくなります。
  • 再利用できる
    同じ構成の環境や似ている環境でコードを再利用することでミスと時間を減らすことができます。
  • 配布記録が残る
    特にメモをする必要がなくどんな日にどんなサービスが構築されているのか確認できます。
  • インフラ管理がしやすい
    構築したサービスを削除する時にスタックだけ削除すると一つづつ削除する必要がないです。

短所

  • たくさんの設定
    色んな設定ができる場合確認することが多いです。Tipsとしては必須項目から確認すると良いです。
  • JSONとYAML文法
    JSONとかYAML文法はあまり使ってないので初めて使う方は文法と込み関数など、適応するのに時間がかかります。

まとめ

今回のブログではCloudFormationに対する内容をまとめてみました。ブログを書きながらもっとCloudFormationを深く勉強することと新しい機能に空いても分かることができました。まだ足りない部分もありますが、皆さんに一つだけでも習うことができたら嬉しいです。

AWS CloudFormation Black Belt 一緒に見ましょう!

AWS CloudFormation Black Belt PPT

AWS CloudFormation Black Belt動画

AWS Black Belt Online Seminar AWS CloudFormation 資料及び QA 公開

最後に

以上、『AWS 再入門ブログリレー 2022』の2日目のエントリ『AWS CloudFormation』編でした。 明日 (2/3) は芦沢の「Amazon Interactive Video Service」の予定です。お楽しみに!!