ElasticBeanstalk 環境で EC2 立ち上がり時に EIP を自動で振り当てる

2 min read読了の目安(約1800字

はじめに

元ネタは以下

AWS ElasticBeanstalk環境でEC2立ち上がり時にEIPを自動で振り当てる - Qiita

上記の記事はとても分かりやすいのだが、Amazon Linux AMI 用なので、Amazon Linux 2 用にしてみる。(ついでに IMDSv2 にも対応)

ロールにポリシーを追加しておく

立ち上げる EC2 用のロールに以下のポリシーを追加しておく。

  • AmazonEC2ReadOnlyAccess
  • ec2-eip-policy
ec2-eip-policy
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:AssociateAddress"
            ],
            "Resource": "*"
        }
    ]
}

フック用のスクリプトを用意

.platform/hooks/postdeployディレクトリを作成してフック用スクリプトを書く。

ワークフロー自体は以下を参照
Elastic Beanstalk Linux プラットフォームの拡張 - AWS Elastic Beanstalk

.platform/hooks/postdeploy/000-associate-eip-with-ec2.sh
#!/usr/bin/env bash
set -e

# プールしている EIP の AllocationID
EIP_ALLOC_IDS="eipalloc-xxxxxxxx eipalloc-yyyyyyyy"

# セッショントークンを取得
TOKEN=$(curl -s -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")

# リージョン指定
region=$(curl -s -H "X-aws-ec2-metadata-token: ${TOKEN}" http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e 's/.$//')
export AWS_DEFAULT_REGION=${region}

available_alloc_id=$(aws ec2 describe-addresses --allocation-ids ${EIP_ALLOC_IDS} | jq -r '[.Addresses[] | select(.InstanceId == null)][0] | .AllocationId')

if [ ${available_alloc_id} = null  ]; then
  echo "EIP already associated"
else
  instance_id=$(curl -s -H "X-aws-ec2-metadata-token: ${TOKEN}" http://169.254.169.254/latest/meta-data/instance-id)
  aws ec2 associate-address --instance-id ${instance_id} --allocation-id ${available_alloc_id}
  echo "Associated ${available_alloc_id}"
fi

ToDo

  • 1 行が長いので、サブシェルあたりを関数に抜き出したい