0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ALB・ターゲットグループ・リスナーもCloudFormationで一括定義する

0
Posted at

背景

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自動解決と合わせて、コンソールでのポチポチ作業をコードに落とし込む感覚がつかめます。

→ CloudFormationでALB + EC2(Tomcat) + RDS 3層構成を自動構築する手順(ブログ)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?