起動時に複数のEIPの中から一つを設定する

2015.05.19

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AutoScalingを利用した場合、EC2インスタンスにはPublicIPアドレスが自動的に割り当てられます。この時のIPアドレスはAWSが保有するアドレスプールから自動的に振り出されます。

システムによっては外部API連携などの際にアクセス元(=EC2)のIPアドレスを固定する必要がある場合があります。解決策の一つはNATインスタンス経由ですが、NATインスタンスがSPOFになりうる事を考えると、冗長化の対策などが少し面倒です。

別の対応方法として、あらかじめEIPをAutoScalingに必要な最大数、つまりAutoScalingGroupのMaxSizeの数だけプーリングしておき、起動時にそのうちの一つをアタッチするような仕組みを入れておくことで解決できます。

その簡易的な実装をbashスクリプトで書きました。

実装

スクリプトを以下に貼ります。

#!/bin/bash

# プールしているEIPのAllocationID
eip_alloc_ids="eipalloc-xxxxxxx eipalloc-yyyyyyy"

instance_id=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
region=$(curl -s 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')

echo $available_alloc_id

aws ec2 associate-address --instance-id ${instance_id} --allocation-id ${available_alloc_id}

スクリプトの冒頭に、プールしておいたEIPのallocation-idをスペース区切りで複数記述しておきます。その後でjqを利用して、EC2インスタンスに紐付けられていないEIPを一つ取得し、それを自分自身に割り振るスクリプトです。

これを起動時に実行するように設定することで、AutoScalingでの起動と同時にEIPがアタッチされます。お試し下さい。