💹
AWS CLIでスポットインスタンスを起動する#1
EC2のスポットインスタンスをAWS CLIから起動する一例を紹介します.
今回は,spot-instance-request
を用いた例です.
#2ではspot-fleet-request
を用いた例を紹介します.
環境
- 0S:
macOS Sonoma 14.6.1
- AWS CLI:
aws-cli/2.11.15 Python/3.11.3 Darwin/23.6.0 exe/x86_64
AWS CLIのセットアップ
AWS CLIをインストールし, aws configure
を使用して認証情報を設定してください.
スポットリクエスト
以下のコマンドでスポットリクエスト(スポットインスタンスの起動)を実行します.
aws ec2 request-spot-instances \
--spot-price "0.05" \
--instance-count 1 \
--type "one-time" \
--launch-specification file://launch-spec.json
主なパラメータ
-
--spot-price
: 上限価格(入札価格) -
--instance-count
:起動するインスタンス数 -
--type
:スポットリクエストの永続性- default:永続的なリクエスト
-
"one-time"
:一時的なリクエスト
-
--launch-specification
:高度な詳細- 任意のJSONファイルにインスタンス起動時の詳細を記述しておく
- 以下の例はインスタンス起動時に,Snowflakeをインストールするように設定したものです.あとでもう少し具体的に説明します.launch-spec.json
{ "ImageId": "ami-xxxxxxxxxxxxxxxx", "InstanceType": "c5.large", "KeyName": "your_key", "SecurityGroupIds": ["sg-xxxxxxxx"], "UserData":"IyEvYmluL2Jhc2gKIyBVcGRhdGUgc3lzdGVtCnN1ZG8geXVtIHVwZGF0ZSAteQoKIyBJbnN0YWxsIG5lY2Vzc2FyeSB0b29scwpzdWRvIHl1bSBpbnN0YWxsIC15IHdnZXQgY3VybCB1bnppcAoKIyBEb3dubG9hZCBhbmQgaW5zdGFsbCBTbm93Zmxha2UgQ0xJICjkvospCmN1cmwgLU8gaHR0cHM6Ly9zZmMtcmVwby5zbm93Zmxha2Vjb21wdXRpbmcuY29tL2NsaS9zbm93Zmxha2UtY2xpLWxpbnV4LXg4Nl82NApjaG1vZCAreCBzbm93Zmxha2UtY2xpLWxpbnV4LXg4Nl82NApzdWRvIG12IHNub3dmbGFrZS1jbGktbGludXgteDg2XzY0IC91c3IvbG9jYWwvYmluL3Nub3dmbGFrZQoKIyBDb25maXJtIGluc3RhbGxhdGlvbgpzbm93Zmxha2UgLS12ZXJzaW9uID4gL3Zhci9sb2cvc25vd2ZsYWtlLWluc3RhbGwubG9nIDI+JjEK" }
ユーザデータの形式
今回はSnowflakeをインストールするように設定しました.
userdata.sh
#!/bin/bash
# Update system
sudo yum update -y
# Install necessary tools
sudo yum install -y wget curl unzip
# Download and install Snowflake CLI (例)
curl -O https://sfc-repo.snowflakecomputing.com/cli/snowflake-cli-linux-x86_64
chmod +x snowflake-cli-linux-x86_64
sudo mv snowflake-cli-linux-x86_64 /usr/local/bin/snowflake
# Confirm installation
snowflake --version > /var/log/snowflake-install.log 2>&1
userdata.sh
をエンコードします.
base64 -i userdata-script.sh -o userdata.b64
userdata.b64
IyEvYmluL2Jhc2gKIyBVcGRhdGUgc3lzdGVtCnN1ZG8geXVtIHVwZGF0ZSAteQoKIyBJbnN0YWxsIG5lY2Vzc2FyeSB0b29scwpzdWRvIHl1bSBpbnN0YWxsIC15IHdnZXQgY3VybCB1bnppcAoKIyBEb3dubG9hZCBhbmQgaW5zdGFsbCBTbm93Zmxha2UgQ0xJICjkvospCmN1cmwgLU8gaHR0cHM6Ly9zZmMtcmVwby5zbm93Zmxha2Vjb21wdXRpbmcuY29tL2NsaS9zbm93Zmxha2UtY2xpLWxpbnV4LXg4Nl82NApjaG1vZCAreCBzbm93Zmxha2UtY2xpLWxpbnV4LXg4Nl82NApzdWRvIG12IHNub3dmbGFrZS1jbGktbGludXgteDg2XzY0IC91c3IvbG9jYWwvYmluL3Nub3dmbGFrZQoKIyBDb25maXJtIGluc3RhbGxhdGlvbgpzbm93Zmxha2UgLS12ZXJzaW9uID4gL3Zhci9sb2cvc25vd2ZsYWtlLWluc3RhbGwubG9nIDI+JjEK
userdata.b64
の中身をlaunch-spec.json
に挿入してスポットリクエストすると,スポットインスタンス起動時にSnowflakeをインストールしてくれます.
スポットインスタンスの起動ログを取得する
AWS CLIでスポットリクエストID( sir-xxxxxxxxx )を指定することでログが取れる.
aws ec2 describe-spot-instance-requests \
--spot-instance-request-ids sir-xxxxxxxx
結果はJSON形式で返される,
ログを見てみると,起動後私がリクエストをキャンセルしていることがわかる.
{
"SpotInstanceRequests": [
{
"CreateTime": "2024-11-30T11:40:01+00:00",
"InstanceId": "i-xxxxxxxxxxxxxxxx",
"LaunchSpecification": {
"SecurityGroups": [
{
"GroupName": "default",
"GroupId": "sg-xxxxxxxx"
}
],
"BlockDeviceMappings": [
{
"DeviceName": "/dev/xvda",
"Ebs": {
"DeleteOnTermination": true,
"SnapshotId": "snap-xxxxxxxxxxxxxxxx",
"VolumeSize": 8,
"VolumeType": "gp2",
"Encrypted": false
}
}
],
"ImageId": "ami-xxxxxxxxxxxxxxxx",
"InstanceType": "c5.large",
"KeyName": "your_key",
"NetworkInterfaces": [
{
"DeleteOnTermination": true,
"DeviceIndex": 0,
"SubnetId": "subnet-xxxxxxxxxxxxxxxxx"
}
],
"Placement": {
"AvailabilityZone": "ap-northeast-1c",
"Tenancy": "default"
},
"Monitoring": {
"Enabled": false
}
},
"LaunchedAvailabilityZone": "ap-northeast-1c",
"ProductDescription": "Linux/UNIX",
"SpotInstanceRequestId": "sir-xxxxxxxx",
"SpotPrice": "0.200000",
"State": "cancelled",
"Status": {
"Code": "instance-terminated-by-user",
"Message": "Spot Instance terminated due to user-initiated termination.",
"UpdateTime": "2024-11-30T11:53:32+00:00"
},
"Tags": [
{
"Key": "aws:ec2spot:fleet-request-id",
"Value": "sfr-xxxx-xxxx-xxxxxxxxxxxxxxxxxx"
}
],
"Type": "one-time",
"InstanceInterruptionBehavior": "terminate"
}
]
}
終わりに
AWS CLIを使ってスポットインスタンスを起動する一例を紹介しました.
あくまで一例に過ぎませんが,本記事を見て参考になる方が1人でもいれば嬉しく思います.
より詳細なスポットリクエストを検討中の方は,公式APIドキュメントを参考にしてみてください.
Discussion