AutoScalingのスポットインスタンスとEIPを起動時に紐づけたい

AutoScalingのスポットインスタンスとEIPを起動時に紐づけたい
Photo by Taylor Vick / Unsplash

EC2のスポットインスタンス...お得ですよね...だって、最大90%オフだなんて!超魅力的です。しかし、使われていないリソースを有効活用する形なので、どうしても普通の用途では使いにくい箇所があります。今回は、開発環境をEC2に移行する予定なので、事前調査といった感じです。

スポットインスタンスは、リソースが足りなくなるとAWSが勝手に終了してしまいます。そこで、オートスケールしておけばいいじゃん!と思ったんですが...EIPを手動で設定するのはかなりめんどくさいので、自動化できればと思い立った次第です。

善は急げとのことなので、早速取り掛かっていきたいと思います。


1. EC2にアタッチするIAMの設定

EC2の起動時にAWSCLIを利用して、EIPの割り当てを行います。そのため、いくつか権限が必要になります。それをアタッチしてAWSCLIを動かせるようにしておきます。

今更ですが、EIPとは「Elastic IP アドレス」です。この記事では以降も今までもこちらの意味です。

  1. ポリシーを作成
以下のJSONを張り付ける
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "ec2:DescribeInstances",
                "ec2:DescribeAddresses",
                "ec2:AssociateAddress"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}
特に入力しなくてもOK

2. ロールを作成

1の工程で作成したポリシーを割り当てて画面下部の次へをクリック

2. 起動テンプレートを作成

EC2 -> インスタンス -> 起動テンプレート

起動テンプレートを作成

ガイダンスをONにする(結構わかりやすくなる)

下のほうにある「高度な詳細」を展開する

スポットインスタンスを利用する場合は、「スポットインスタンスをリクエスト」にチェックを入れる

先ほど作成したIAMロールを選択する

一番下の「ユーザーデータ」にスクリプトを張り付ける

#!/bin/bash
eip_alloc_ids="eipalloc-****************" #Elastic IP アドレスのアソシエーション ID

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}

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

3. AutoScalingを組む

後は、そのまま流れに沿って作っていくだけです。


4. 最後に

AmazonLinux2 とかだと最初からAWSCLIが入っているのであまり問題ないかもしれませんが、Ubuntuやほかのディストリビューションで運用している場合は、先にAWSCLIが使える環境を整えて、AMIを取得して1の工程からやったほうがいいと思います。

何事も下準備が大切ってことですね!

今回設定したスポットインスタンスを開発環境として運用した費用や使用感についても後ほど記事にしたいなと思います!