今回から実際の手順を解説していきます。今回実施するのは以下の内容です。
- データ保存用のEBS作成
- スポットインスタンス起動時に呼び出すスクリプト作成
- スポットインスタンスにアタッチするIAMロール(インスタンスプロファイル)作成
- 起動テンプレート作成
前提条件
- スポットインスタンスを起動するVPCおよびプライベートサブネット、NATGateway(NATインスタンス)は構築済み
- プライベートサブネットにはSSMセッションマネージャで接続するためにVPCエンドポイントを作成済み
- スポットインスタンスに利用するAMIは構築済み
- AMIにはSSMエージェントをインストール済み
データ保存用のEBS作成
以下から開発用のスポットインスタンスでデータ保存先として利用するEBSを作成していきます。ボリュームタイプやサイズ等は自由に選択して大丈夫ですが、アベイラビリティゾーンは後に作るスポットインスタンスと揃えないと利用できないので注意してください。
https://ap-northeast-1.console.aws.amazon.com/ec2/home?region=ap-northeast-1#CreateVolume:
EBS作成後EBS上にファイルシステムを作成します。作成手順は以下の公式ドキュメントを参考にしてください。ファイルシステム作成に使用できるインスタンスがない場合はCloud9を作成して一時的に利用するのが手っ取り早くておすすめです。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-using-volumes.html#ebs-format-mount-volume
スポットインスタンス起動時に呼び出すスクリプト作成
スポットインスタンスが起動する際に実行するスクリプトを事前に作成しておきます。
#!/bin/bash
VOLUME_ID="データ保存用EBSのID"
NAME="後程スポットインスタンスにつけるNameタグの値"
MOUNT_POINT="/data" #データ保存用EBSのファイルシステムをマウントするパス
#NAMEで指定したタグを持つインスタンスのIDを取得
INSTANCE_ID=`aws ec2 describe-instances --filters Name=tag:Name,Values=${Name} Name=instance-state-name,Values=running | grep InstanceId | aws '{print $2}' | head -n1 | sed -e 's/[",]//g'`
#インスタンスにデータ保存用EBSをアタッチ
aws ec2 attach-volume --volume-id $VOLUME_ID --instance-id $INSTANCE_ID --device /dev/sdf
#アタッチ実行してから実際に使えるようになるまで時間差があるのでちょっと寝る
sleep 10
#アタッチされたEBSのデバイス名を取得してfstabへ書き込み&マウント
DEVICE_NAME=`lsblk | grep disk |tail -n1 | awk '{print $1}'`
sudo mkdir -m 777 ${MOUNT_POINT}
UUID=`sudo blkid -o value /dev/${DEVICE_NAME} | head -n1`
sudo echo "UUID=$UUID /data xfs(※作成したファイルシステムの種類に合わせて変えてください) defaults 0 0" >> /etc/fstab
スポットインスタンスにアタッチするIAMロールの作成
ここを参考にEC2にアタッチするIAMロールを作成します。AmazonSSMManagedInstanceCoreポリシー相当の権限が付いているのが期待値です。
起動テンプレート作成
ここからスポットインスタンス作成用の起動テンプレートを作成していきます。
この際の注意点は以下の通りです。
- AMIは前提条件で指定したAMIを指定
- ネットワーク周りの設定はEBS作成で指定したアベイラビリティゾーンに合わせる
- リソースタグでインスタンスにNameタグを設定する。値はスクリプト作成時に指定したNameの値を使う。
- 高度な詳細でインスタンスプロファイルの作成したIAMロールを指定する
- ユーザーデータに作成したスクリプトを記載する
以上で起動テンプレートの作成まで完了しました。次回から実際にスポットリクエストを作成していきます。