🏭
ElasticBeanstalk 環境で EC2 立ち上がり時に EIP を自動で振り当てる
はじめに
元ネタは以下
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 行が長いので、サブシェルあたりを関数に抜き出したい
Discussion