この記事を書いたきっかけ
- EC2へのアクセス元のネットワークがIPホワイトリスト形式でアクセス制限を行っていたため、EIPで固定化する必要があった
- 既存の記事で紹介されている実装はインスタンスメタデータv1が前提となっており、v2では稼働しなかった
前提知識
事前に用意するもの
- EC2 Auto Scaling設定
- EIP
必要な設定
- 以下のポリシーを含めたIAMロールにEC2に付与し、EC2自身が空いているEIPの参照と割り当てが行えるようにする
- 起動テンプレートのUser Dataに以下のスクリプトを記載し、起動時に空いているEIPの参照と割り当てを行わせる。その際、メタデータを参照するためのトークンを取得する
#!/bin/bash
## EIPの自動割り当て処理
TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`
curl http://169.254.169.254/latest/meta-data/instance-id -H "X-aws-ec2-metadata-token: $TOKEN
INSTANCE_ID=`curl http://169.254.169.254/latest/meta-data/instance-id`
REGION=`curl http://169.254.169.254/latest/dynamic/instance-identity/document | grep region | awk -F\" '{print $4}'`
for ALLOC_ID in `aws ec2 describe-addresses --region=$REGION --filter "Name=domain,Values=vpc" --output text | grep -v eipassoc- | awk '{print $2}'`
do
CMD="aws ec2 associate-address --instance-id $INSTANCE_ID --allocation-id $ALLOC_ID --no-allow-reassociation --region=$REGION"
$CMD
STATUS=$?
if [ 0 = $STATUS ] ; then
exit 0
fi
done
exit 1