CloudFormation をはじめよう!
![CloudFormation をはじめよう!](https://techblog.asia-quest.jp/hubfs/TechBlog/202406_cloudformation_thum.webp)
目次
はじめに
クラウドインテグレーション部の井川です。
本記事では、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 エンドポイントのもの)です。
まずはスタック一覧から、「スタックの作成」をクリックします。
「既存のテンプレートを選択」と「テンプレートファイルのアップロード」を選択し、手元にあるテンプレートをアップロードします。
次の画面でスタック名を設定し、必要は場合はパラメーターを設定します。
オプションを設定します。
タグや IAM ロールを設定できますが、検証する場合は全てデフォルトで進むことが多いと思います。
最後に、設定値の確認画面が表示されます。
一番下までスクロールして「送信」をクリックします。
これでやっとスタックの作成が始まります。
もし作成に失敗すればスタックを削除し、手元のテンプレートを修正して再度この手順をやり直します。
エラーメッセージを見ながらテンプレートを修正した後、何回も画面遷移してスタックを作成します。
これが結構しんどいです。
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を御覧ください。