CloudFormation をはじめよう!

    CloudFormation をはじめよう!

    目次

      はじめに

      クラウドインテグレーション部の井川です。

      本記事では、AWS の IaC サービスである CloudFormation のおすすめの使用方法や注意点を解説した記事です。
      CloudFormation を利用されたことがない方は、ぜひ利用してみてください。

      一番伝えたいこと

      aws cloudformation deployを利用して CloudFormaiton を使いましょう!

      CloudFormation とは

      AWS CloudFormation とは、AWS で提供されている IaC (Infrastructure as Code) サービスです。
      IaC とは、インフラリソースをコードを利用して作成・管理することです。

      CloudFormation を使用すると、AWS リソースをコードとして(テキストベースで)管理することができるようになります。
      まず、CloudFormation の書式に沿ってテンプレートファイルと呼ばれるリソース定義のコードを作成します。
      このコードは、JSON あるいは YAML 形式で記述することができます。
      作成したテンプレートを CloudFormation のサービス上で展開すると、スタックという単位で、記述したリソース定義に沿って AWS リソースが作成されます。

      CloudFormation のような IaC サービスを利用することによるメリットは大きく二つあります。
      一つ目は、インフラをコードとして定義しているため、一度作成した環境を簡単に複製できることです。
      二つ目は、コードで定義した内容に沿って自動でリソースが作成されるため、ヒューマンエラーによる設定ミスを削減できることです。

      一方で、ゼロから CloudFormation テンプレートを作成するのは、マネジメントコンソールからのリソース作成と比較して難易度が高いです。
      ただ、最近 IaC ジェネレーターという機能も登場し、テンプレートファイルの作成自体の難易度はかなり下がっている印象があります。
      IaC ジェネレーターでは、既に作成済みのリソースから CloudFormation テンプレートを生成することが可能です。
      詳しくは下記の記事をご覧ください。

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

      なぜ CloudFormation を推すのか

      IaC のメリットとして述べた通り、リソースの再作成が容易であったり、作成時のヒューマンエラーを回避できるというメリットがあります。

      個人的には、リソースの削除が簡単になる部分が大きなメリットだと感じます。
      検証リソースを削除し忘れて予期せぬ課金が発生したり、誰が何のために作成したか分からない不要なリソースが残り続けていたり、という状況はよくあるのではないでしょうか。

      検証リソースを CloudFormation で作成しておくと、スタック削除のみで作成したリソースを削除することが可能です。

      例えば、プライベートサブネット上にある EC2 に対して、セッションマネージャーで接続する場合に必要な VPC エンドポイントは、下記のようにテンプレート化が可能です。

      Parameters:
      VpcId:
      Type: AWS::EC2::VPC::Id
      Default: vpc-xxxxxxxxxxxxxxxxx
      1aSnetId:
      Type: AWS::EC2::Subnet::Id
      Default: subnet-xxxxxxxxxxxxxxxxx
      SsmSgId:
      Type: AWS::EC2::SecurityGroup::Id
      Default: sg-xxxxxxxxxxxxxxxxx

      Resources:
      SsmVpce:
      Properties:
      PrivateDnsEnabled: True
      SecurityGroupIds:
      - !Ref SsmSgId
      ServiceName: com.amazonaws.ap-northeast-1.ssm
      SubnetIds:
      - !Ref 1aSnetId
      VpcEndpointType: Interface
      VpcId: !Ref VpcId
      Type: AWS::EC2::VPCEndpoint

      SsmmessagesVpce:
      Properties:
      PrivateDnsEnabled: True
      SecurityGroupIds:
      - !Ref SsmSgId
      ServiceName: com.amazonaws.ap-northeast-1.ssmmessages
      SubnetIds:
      - !Ref 1aSnetId
      VpcEndpointType: Interface
      VpcId: !Ref VpcId
      Type: AWS::EC2::VPCEndpoint

      Ec2messagesVpce:
      Properties:
      PrivateDnsEnabled: True
      SecurityGroupIds:
      - !Ref SsmSgId
      ServiceName: com.amazonaws.ap-northeast-1.ec2messages
      SubnetIds:
      - !Ref 1aSnetId
      VpcEndpointType: Interface
      VpcId: !Ref VpcId
      Type: AWS::EC2::VPCEndpoint

      必要になればスタックを作成し、検証が終わればスタックを削除しましょう。
      これで不要なリソースが AWS 上に残り続けることはありません。

      CloudFormation のおすすめの使用方法

      AWS CLI から作成する

      AWS CLI から作成しましょう!! 
      これだけで作業効率が格段に上がりますので、ぜひ利用してみてください!

      マネジメントコンソールから作成する場合と、AWS CLI から作成する場合を比較します。

      マネジメントコンソールから作成する場合

      マネジメントコンソールからスタック作成する場合には、複数の画面遷移が発生します。
      テンプレートは準備済み(先程の VPC エンドポイントのもの)です。
      まずはスタック一覧から、「スタックの作成」をクリックします。
      202406_cloudformation_01

      「既存のテンプレートを選択」と「テンプレートファイルのアップロード」を選択し、手元にあるテンプレートをアップロードします。
      202406_cloudformation_02

      次の画面でスタック名を設定し、必要は場合はパラメーターを設定します。
      202406_cloudformation_03

      オプションを設定します。
      タグや IAM ロールを設定できますが、検証する場合は全てデフォルトで進むことが多いと思います。
      202406_cloudformation_04

      最後に、設定値の確認画面が表示されます。
      一番下までスクロールして「送信」をクリックします。
      202406_cloudformation_05

      これでやっとスタックの作成が始まります。

      もし作成に失敗すればスタックを削除し、手元のテンプレートを修正して再度この手順をやり直します。
      エラーメッセージを見ながらテンプレートを修正した後、何回も画面遷移してスタックを作成します。
      これが結構しんどいです。

      AWS CLI から作成する場合

      AWS CLI を使用する場合は、aws cloudformation deployというコマンドで一撃でスタックを作成できます。
       deploy — AWS CLI 2.1.0 Command Reference

      下記のコマンドを実行します。

      $ aws cloudformation deploy \
      --template-file [TemplateFile] \
      --stack-name [StackName]

      しばらく待つと、下記のように「Successfully created/updated stack」と表示されてスタック作成が完了します。

      Waiting for changeset to be created..
      Waiting for stack create/update to complete
      Successfully created/updated stack - [StackName]

      作成に失敗した場合はスタックを削除し、テンプレート修正後に再度同じコマンドを実行するだけです。
      コマンドライン操作としては「↑」キーと「Enter」を押すだけです。
      スタック削除のコマンドもありますが、削除はマネジメントコンソールで行っても大した手間ではないです。

      テンプレートに修正を加えて、スタックを更新するという場合にも、同じくaws cloudformation deployというコマンドを使用することができます。

      AWS CLI のインストール方法については、AWS のドキュメントを参照してください。
      Windows ユーザの方でも、コマンドプロンプトや PowerShell より Linux コマンドに慣れている方が多いと思いますので、個人的には WSL 上に AWS CLI をインストールするのがおすすめです。

      CloudFormation の注意点

      CloudFormation の注意点をいくつか紹介します。

      CloudFormation 非対応の設定項目が存在する

      マネジメントコンソールから作成できるものでも、CloudFormaiton に対応していないものもあります。

      代表的なリソースだと、IAM ポリシーや VPC エンドポイントはタグ付けに対応していません。

      このような場合は、マネジメントコンソールもしくは AWS CLI で対応する必要があります。

      IAM ポリシーのタグ付けコマンド tag-policy — AWS CLI 2.15.40 Command Reference

      $ aws iam tag-policy \
      --policy-arn [PolicyArn] \
      --tags Key=[Key],Value=[Value]

      VPC エンドポイントのタグ付けコマンド create-tags — AWS CLI 2.15.47 Command Reference

      $ aws ec2 create-tags \
      --resources [VpcEndpointId] \
      --tags Key=[Key],Value=[Value]

       

      パラメーターのデフォルト値はスタック作成時にのみ使用される

      CloudFormation テンプレートでは、スタック展開時に指定する値としてパラメーターが設定できます。
      このパラメーターにはデフォルト値を指定することが可能です。

      Parameters:
      VpcId:
      Type: AWS::EC2::VPC::Id
      Default: vpc-xxxxxxxxxxxxxxxxx
      1aSnetId:
      Type: AWS::EC2::Subnet::Id
      Default: subnet-xxxxxxxxxxxxxxxxx
      SsmSgId:
      Type: AWS::EC2::SecurityGroup::Id
      Default: sg-xxxxxxxxxxxxxxxxx

      上記の例では、VpcIdパラメーターのデフォルト値としてvpc-xxxxxxxxxxxxxxxxxを指定しています。

      注意点として、このデフォルト値はスタックを作成する場合にしか使用されません。
      スタックを更新する際には、コマンドで指定したテンプレート内のパラメーターのデフォルト値に関係なく、スタックに設定されている既存のパラメーターをそのまま使用します。

      パラメーターを更新したい場合は--parameter-overridesオプションを指定します。

      $ aws cloudformation deploy \
      --template-file [TemplateFile] \
      --stack-name [StackName] \
      --parameter-overrides VpcId=vpc-00000000000000000

      まとめ

      いくつか注意点はありますが、ぜひ CloudFormation を利用して効率的にリソースを管理しましょう!
      CloudFormaton スタック作成時には、ぜひaws cloudformation deployを利用してください!

      参考

      アジアクエスト株式会社では一緒に働いていただける方を募集しています。
      興味のある方は以下のURLを御覧ください。