💹

AWS CLIでスポットインスタンスを起動する#1

2024/11/30に公開

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