非オートスケール起動のEC2をELB(ALB)に自動アタッチさせてみた

2019.05.15

はじめに

AWSチームのすずきです。

2つの異なるCloudFormationテンプレートで設置したELB(ALB)とEC2(Amazon Linux2)。 EC2インスタンスの起動時に実行されるUserDataを利用して、ELBへの自動アタッチを行う機会がありましたので、紹介させていただきます。

構成図

設定

UserData

#cloud-config
packages:
  - jq
  - httpd
runcmd:
  - export AWS_DEFAULT_REGION=ap-northeast-1
  - STACK_NAME=sample-1
  - INSTANCE_ID=`curl -s http://169.254.169.254/latest/meta-data/instance-id`
  - TARGET_GROUP_ARN=`aws cloudformation describe-stack-resource --stack-name $STACK_NAME --logical-resource-id AlbTargetGroup | jq -r .StackResourceDetail.PhysicalResourceId`
  # httpd setting
  - echo "<html><body>$INSTANCE_ID<br>`date`</body></html>" > /var/www/html/index.html
  - systemctl start httpd
  - systemctl enable httpd
  # elbv2 register-targets
  - aws elbv2 register-targets --target-group-arn $TARGET_GROUP_ARN --targets Id=$INSTANCE_ID,Port=80

packages

  • Webサーバとなる「httpd」と、awscliの実行結果の加工のため「jq」をインストールします。

runcmd

  • 環境変数 AWS_DEFAULT_REGION は、CloudFormationの疑似パラメータで設定しました。
  • インスタンスIDは、UserDataを実行するEC2のメタデータを利用します。
  • STACK_NAMEは、ELBを作成したCloudFormationの名称をパラメータから反映させました。
  • アタッチ先となるターゲットグループ情報(ARN)は、CloudFormationのリソース情報から awscli を利用して都度取得します。
  • インストール直後のhttpd、ELBのヘルスチェックパスを成功させるために「index.html」を設置しています。
  • CLIの引数--target-group-arn--targetsに得られた値を反映し、ELBへのアタッチを実施します。

IAMロール

  • 特定のCloudFormationスタックの参照権限と、指定ALBのアタッチ権限をEC2インスタンスに許可しました。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "cloudformation:Describe*"
            ],
            "Resource": [
                "arn:aws:cloudformation:ap-northeast-1:000000000000:stack/sample-1*"
            ],
            "Effect": "Allow"
        },
        {
            "Action": [
                "elasticloadbalancing:Describe*",
                "elasticloadbalancing:RegisterTargets"
            ],
            "Resource": [
                "arn:aws:elasticloadbalancing:ap-northeast-1:000000000000:targetgroup/sampl-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
            ],
            "Effect": "Allow"
        }
    ]
}

動作確認

ELB

  • 起動したEC2インスタンス、ELBのターゲットグループに登録されました。

CloudTrail

  • 証跡情報として、EC2インスタンスによる RegisterTargets イベントを確認できました。

    まとめ

EC2 AutoScallingで起動するEC2インスタンスであれば、オートスケールの設定でELBにアタッチが可能です。

EC2のローカルでDBが動作、EC2がステートフルであるためオートスケールが利用できない場合や、 開発環境などでオートスケールの発動を望まない場合、今回のAWSCLIとUserDataをお試し頂ければと思います。

今回はCloudFormation の「Resouces」を簡易なパラメータストア相当として利用しましたが、 秘匿が望ましい情報を扱う場合には、SSMのパラメータストアなどを適切に設定してご利用ください。

テンプレート

今回利用したCloudFormationテンプレートです。

sample1

  • ELB、ELB、EC2が利用するセキュリティグループ、EC2用のIAMロールを作成します。

sample2

  • UserDataを設定した起動テンプレートを利用し、EC2インスタンスを作成します。
  • テンプレートのネストは避け、!ImportValueを用いて sample-1で作成したリソース情報を参照しています。