背景
ALB + EC2(Tomcat) + RDS MySQLの3層構成をCloudFormationで自動構築しました。コンソールでは3つの別々の画面で設定していたALB関連リソースが、YAMLの中でどう表現されているかに焦点を当てます。
1. ALB・ターゲットグループ・リスナーはそれぞれ独立したリソース型
TargetGroup:
Type: AWS::ElasticLoadBalancingV2::TargetGroup
Properties:
Protocol: HTTP
Port: 8080
HealthCheckPath: /
Targets:
- Id: !Ref EC2Instance
Port: 8080
ALB:
Type: AWS::ElasticLoadBalancingV2::LoadBalancer
Properties:
Type: application
Scheme: internet-facing
Subnets: [!Ref PublicSubnet1, !Ref PublicSubnet2]
SecurityGroups: [!GetAtt ALBSecurityGroup.GroupId]
ALBListener:
Type: AWS::ElasticLoadBalancingV2::Listener
Properties:
LoadBalancerArn: !Ref ALB
Port: 80
DefaultActions:
- Type: forward
TargetGroupArn: !Ref TargetGroup
コンソールでは「ターゲットグループの作成」「ロードバランサーの作成」「リスナー設定」という3つの別々の画面操作でしたが、CloudFormationでは3つのリソースとして並べて記述するだけです。ALBListenerがTargetGroupとALBの両方を!Refで結びつけることで、リソース間の関連が明示的にコードに残ります。
2. ALBの2AZ要件はサブネットを2つ配列で渡すだけ
Subnets:
- !Ref PublicSubnet1
- !Ref PublicSubnet2
コンソールでは「アベイラビリティーゾーンを2つ選択してください」というバリデーションを画面上で確認しながら操作しますが、CloudFormationでは単にSubnetsに2つのサブネットIDを配列で渡すだけです。誤って1つしか指定しなければデプロイ時にエラーになるため、UI操作なしでも制約は同じように機能します。
3. String型パラメータなので--with-decryptionが不要
aws ssm get-parameter \
--name "/my/alb/db-password" \
--query "Parameter.Value" \
--output text \
--region ap-northeast-1
CloudFormationのAWS::SSM::ParameterはSecureString型を作成できず、String型(平文)のみサポートしています。そのため取得時に--with-decryptionフラグが不要になります。コンソール版でSecureStringとして作成した場合との違いがここに現れます。本番運用ではSecureStringを事前に手動作成し、{{resolve:ssm-secure:/path}}構文で参照する方法が推奨されます。
4. {{resolve:ssm:...}}でAMI IDを毎回動的に解決する
EC2Instance:
Type: AWS::EC2::Instance
Properties:
ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64}}'
AWSが管理するパブリックSSMパラメータから、デプロイ時点の最新Amazon Linux 2023 AMIを自動取得します。テンプレート内にAMI IDをハードコードしないため、AWSが新しいAMIをリリースするたびにテンプレートを更新する必要がありません。
5. コマンド1本で27リソース、削除も1本
コンソール版: 約40〜50分・13ステップの手動削除
CloudFormation版: create-stack 1本(RDS待ち込み約20分)、delete-stack 1本
ALB・EC2・RDS・IAM・VPC関連の27リソースが1つのtemplate.yamlに集約されているため、デプロイも削除もコマンド1本で完結します。特に削除では、ALBのリスナー・ターゲットグループ・RDSといった依存関係を持つリソースの削除順序をCloudFormationが自動的に解決してくれます。
まとめ
ALB関連の3リソース(TargetGroup・LoadBalancer・Listener)を!Refで結びつけてコード化できる点と、String型パラメータゆえの--with-decryption不要という違いが、このハンズオンでのCloudFormation活用のポイントでした。SSM AMI自動解決と合わせて、コンソールでのポチポチ作業をコードに落とし込む感覚がつかめます。