[アップデート]Amazon EC2の新しいSpotインスタンス 「Spot Block」が発表されました! #reinvent

アイキャッチ AWS EC2

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ウィスキー、シガー、パイプをこよなく愛する大栗です。
Keynoteを前に、新機能ラッシュの様相となっているre:Invent 2015です。先ほどEC2のSpotインスタンスに新しいオプションSpot Blockが発表されましたのでご紹介します。

Spot Block?

Spotインスタンスは、価格の変動により何時停止するか分からない起動方法(正確には停止の2分前に検知可能)です。そのためSpotインスタンスを使用する場面は限定的なことが多かったと思います。
しかし、Spot Blockでは一定の時間起動は価格変動があっても起動し続けられるオプションとなっています。最大で6時間起動し続けられます。

試してみる

まずはAWS-CLIをバージョンアップしてください。AWS-CLI 1.8.10以降でSpot Blockが使用できます。

sudo pip install -U awscli

次にCLIのオプションを決めるために、skeletonを出力します。

aws ec2 request-spot-instances --generate-cli-skeleton

以下のオプションとなります。BlockDurationMinutesが増えていますね。BlockDurationMinutesは60分の倍数(60、120、180、240、300、360)が設定可能です。

{
    "DryRun": true, 
    "SpotPrice": "", 
    "ClientToken": "", 
    "InstanceCount": 0, 
    "Type": "", 
    "ValidFrom": null, 
    "ValidUntil": null, 
    "LaunchGroup": "", 
    "AvailabilityZoneGroup": "", 
    "BlockDurationMinutes": 0, 
    "LaunchSpecification": {
        "ImageId": "", 
        "KeyName": "", 
        "SecurityGroups": [
            ""
        ], 
        "UserData": "", 
        "AddressingType": "", 
        "InstanceType": "", 
        "Placement": {
            "AvailabilityZone": "", 
            "GroupName": ""
        }, 
        "KernelId": "", 
        "RamdiskId": "", 
        "BlockDeviceMappings": [
            {
                "VirtualName": "", 
                "DeviceName": "", 
                "Ebs": {
                    "SnapshotId": "", 
                    "VolumeSize": 0, 
                    "DeleteOnTermination": true, 
                    "VolumeType": "", 
                    "Iops": 0, 
                    "Encrypted": true
                }, 
                "NoDevice": ""
            }
        ], 
        "SubnetId": "", 
        "NetworkInterfaces": [
            {
                "NetworkInterfaceId": "", 
                "DeviceIndex": 0, 
                "SubnetId": "", 
                "Description": "", 
                "PrivateIpAddress": "", 
                "Groups": [
                    ""
                ], 
                "DeleteOnTermination": true, 
                "PrivateIpAddresses": [
                    {
                        "PrivateIpAddress": "", 
                        "Primary": true
                    }
                ], 
                "SecondaryPrivateIpAddressCount": 0, 
                "AssociatePublicIpAddress": true
            }
        ], 
        "IamInstanceProfile": {
            "Arn": "", 
            "Name": ""
        }, 
        "EbsOptimized": true, 
        "Monitoring": {
            "Enabled": true
        }, 
        "SecurityGroupIds": [
            ""
        ]
    }
}

最小限のオプションとして、以下の内容のJSONファイルを作成しました。BlockDurationMinutesは60の倍数なので60を設定しています。CLIのオプションでは、--block-duration-minutesオプションとなります。

{
    "SpotPrice": "0.5", 
    "InstanceCount": 1, 
    "BlockDurationMinutes": 60, 
    "LaunchSpecification": {
        "ImageId": "ami-e3106686", 
        "KeyName": "virginia-xxxxxxxx", 
        "InstanceType": "m4.large"
    }
}

この内容でコマンドを実行します。

aws ec2 request-spot-instances --cli-input-json file://spot_block.json

以下のようにSpotリクエストが表示されます。

EC2_Management_Console

少し待つと、以下のようにステータスがactiveに変わります。

EC2_Management_Console

この様にインスタンスが普通に起動しました。

EC2_Management_Console

さいごに

Spotインスタンスのアップデートは、先日Spot Fleetが発表されて全体のキャパシティを確保することが出来るようになりました。今回は一定時間の可用性を確保するオプションが提供されるようになりました。そのため様々な場面でスポットインスタンスを使用できるのではないでしょうか?