🐈

aws cliでサクッとEC2インスタンスにElastic IPを設定する方法

2024/09/30に公開

普段はパブリック IP アドレスを設定せずに必要な時だけパブリック IP アドレスを設定するなど、EC2 に Elastic IP をつけたり外したりすることが出てきたので、簡単にできるようにシェルにまとめました。

Elastic IP アドレスの取得・割り当て

こちらは、Elastic Ip アドレスをつける場合のシェル

#!/bin/bashDEFAULT_INSTANCE_ID=""
DEFAULT_PROFILE_NAME="default"
DEFAULT_NAME_TAG_VALUE=""
# EC2インスタンスにElastic IPを関連付ける

if [ -z "${BASH_VERSION}" ]; then
    echo "Bashで実行してください"
    exit 1
fi

# デフォルト値の設定DEFAULT_INSTANCE_ID=""
DEFAULT_PROFILE_NAME="default"
DEFAULT_NAME_TAG_VALUE=""DEFAULT_INSTANCE_ID=""
DEFAULT_PROFILE_NAME="default"
DEFAULT_NAME_TAG_VALUE=""
DEFAULT_INSTANCE_ID=""
DEFAULT_PROFILE_NAME="default"
DEFAULT_NAME_TAG_VALUE=""

# 第1引数が指定されていればインスタンスIDとして使用。指定されていなければデフォルトのインスタンスIDを使用
INSTANCE_ID=${1:-"${DEFAULT_INSTANCE_ID}"}

# 第2引数が指定されていればNameタグの値として使用。指定されていなければデフォルトのNameタグの値を使用
NAME_TAG_VALUE=${2:-"${DEFAULT_NAME_TAG_VALUE}"}

# 第3引数が指定されていればプロファイル名として使用。指定されていなければデフォルトを使用
PROFILE_NAME=${3:-"${DEFAULT_PROFILE_NAME}"}

# 引数チェック
if [ -z "${PROFILE_NAME}" ] || [ -z "${INSTANCE_ID}" ]; then
    echo "Usage: $0 <instance-id> [name_tag_value] [profile-name] "
    exit 1
fi


# Elastic IPを新規取得
ALLOCATION_ID=$(aws ec2 allocate-address --profile "${PROFILE_NAME}" --query 'AllocationId' --output text)
PUBLIC_IP=$(aws ec2 describe-addresses --allocation-ids "${ALLOCATION_ID}" --profile "${PROFILE_NAME}" --query 'Addresses[0].PublicIp' --output text)

if [ -z "${ALLOCATION_ID}" ]; then
    echo "Elastic IPの割り当てに失敗しました。"
    exit 1
fi

echo "Elastic IPを割り当てました。割り当てID: ${ALLOCATION_ID}"
echo "Elastic IPアドレスを割り当てました: ${PUBLIC_IP}"

# はElastic IPにタグを追加
if [ ! -z "${NAME_TAG_VALUE}" ]; then
    TAG_KEY="Name"
    if ! aws ec2 create-tags --profile "${PROFILE_NAME}" --resources "${ALLOCATION_ID}" --tags Key="${TAG_KEY}",Value="${NAME_TAG_VALUE}"; then
        echo "Elastic IP ${ALLOCATION_ID}にタグを作成するのに失敗しました。"
        exit 1
    fi
    echo "Elastic IP ${ALLOCATION_ID}にNameタグを正常に追加しました。"
fi

# Elastic IPを指定のインスタンスに関連付け
ASSOCIATION_ID=$(aws ec2 associate-address --profile "${PROFILE_NAME}" --instance-id "${INSTANCE_ID}" --allocation-id "${ALLOCATION_ID}" --query 'AssociationId' --output text)

if [ -z "${ASSOCIATION_ID}" ]; then
    echo "インスタンス ${INSTANCE_ID} にElastic IPを関連付けるのに失敗しました。"
    exit 1
fi

echo "Elastic IPをインスタンス ${INSTANCE_ID} に正常に関連付けました。関連付けID: ${ASSOCIATION_ID}"

ElasticIP アドレスの解除・解放

こちらは EC2 の ElasticIP アドレスを解除し、ElasticIP アドレス自体を開放します。

#!/bin/bash
# Public IPをEC2インスタンスから解除し、解放するスクリプト

# デフォルト値の設定
DEFAULT_INSTANCE_ID=""
DEFAULT_PROFILE_NAME="default"

# 第1引数が指定されていればインスタンスIDとして使用。指定されていなければデフォルトのインスタンスIDを使用
INSTANCE_ID=${1:-"${DEFAULT_INSTANCE_ID}"}

# 第2引数が指定されていればプロファイル名として使用。指定されていなければデフォルトを使用
PROFILE_NAME=${2:-"${DEFAULT_PROFILE_NAME}"}

# 引数チェック
if [ -z "${PROFILE_NAME}" ] || [ -z "${INSTANCE_ID}" ]; then
    echo "Usage: $0 <instance-id> [profile-name] "
    exit 1
fi


# Elastic IPのAssociation IDとAllocation IDを取得
ADDRESS_INFO=$(aws ec2 describe-addresses --profile "${PROFILE_NAME}" --filters "Name=instance-id,Values=${INSTANCE_ID}" --query 'Addresses[0].[AssociationId, AllocationId]' --output text)
ASSOCIATION_ID=$(echo "${ADDRESS_INFO}" | awk '{print $1}')
ALLOCATION_ID=$(echo "${ADDRESS_INFO}" | awk '{print $2}')

if [[ "${ASSOCIATION_ID}" == "None" ]]; then
    echo "インスタンス ${INSTANCE_ID} に関連付けられた Elastic IP はありません。"
    exit 1
fi

# Elastic IPの関連付けを解除
if ! aws ec2 disassociate-address --profile ${PROFILE_NAME} --association-id "${ASSOCIATION_ID}"; then
    echo "Association ID ${ASSOCIATION_ID} の Elastic IP の関連付け解除に失敗しました。"
    exit 1
fi
echo "Association ID ${ASSOCIATION_ID} の Elastic IP の関連付けを正常に解除しました。"

# Elastic IPを解放
if ! aws ec2 release-address --profile ${PROFILE_NAME} --allocation-id "${ALLOCATION_ID}"; then
    echo "Allocation ID ${ALLOCATION_ID} の Elastic IP の解放に失敗しました。"
    exit 1
fi
echo "Allocation ID ${ALLOCATION_ID} の Elastic IP を正常に解放しました。"

exit 0

Discussion