AWS CLI コマンドを利用してEC2スポットインスタンスを起動する方法

AWS EC2 を利用すると、クラウドの仮想サーバを構築することができます。

オンデマンドインスタンスはデータを恒久的に保持できます。一方で、スポットインスタンスを使用すると、シャットダウンしたタイミングでデータが破棄される反面、低コストで運用することができます。

スポットインスタンスは、ウェブアプリなどの開発環境を利用するシーンで効果を発揮すると個人的には考えています。

この記事では、AWS CLI コマンドを利用してEC2スポットインスタンスを起動する方法を紹介します。

この記事のまとめ

  • 必要なIAM権限は Amazon EC2 FullAccess
  • スポットインスタンスの起動リクエストは aws ec2 request-spot-instances コマンド
  • 起動したら、IPアドレスは AWS Management Console のEC2画面から確認が可能
  • コマンドからIPアドレスを確認する方法もある

必要なIAM権限

EC2インスタンスを起動するためのIAM権限が必要です。

ここでは「Amazon EC2 FullAccess」を割り当てました。

EC2 FullAccessを割り当てたIAMユーザーの作成手順

IAMユーザーの作成手順を紹介します。

まず、IAM画面から「Add User」をクリックします。

  • User Name は 「EC2Launcher」としました。

  • Select AWS credential type は「Access Key – Programmatic access」を選択しました。

次に、権限設定を行います。

  • Attach existing policies directlyから「EC2full」と検索すると「AmazonEC2FullAccess」が表示されますので、これにチェックを入れます。

その次の「Add tags(optional)」は何も設定しません。

Preview 画面で設定内容を確認します。OKであれば「Create user」ボタンをクリックします。

IAMユーザの作成に成功したら「Success」が表示されます。「Download.csv」ボタンをクリックし、Access Key ID と Secret access key が記載されたCSVファイルをダウンロードしておきましょう。

各種パラメタの確認

スポットインスタンスを起動するためのパラメタを確認していきましょう。

まず1つ目は、AMIのイメージIDです。

これはEC2の Images -> AMIs から確認できます。

2つ目は、インスタンスタイプです。

これは以下のページから確認することができます。

オンデマンドインスタンスの料金 - Amazon EC2 (仮想サーバー) | AWS
オンデマンドインスタンスについては、お客様が使用された EC2 インスタンスの料金のみのお支払いとなります。オンデマンドインスタンスを使用することにより、ハードウェアのプランニング、購入、維持に伴うコストや手間が省け、高額な固定費となりがちな運用コストを、より低額な変動費に抑えられます。

ちなみにこのページはオンデマンドインスタンスの料金が表示されています。スポットインスタンスはオンデマンドインスタンスより安い価格で提供されます。

3つ目は、認証キー名です。

これはEC2の Network & Security -> Key Pairsから確認ができます。

AWS CLI ツールのインストールと設定

AWS CLI ツールのインストールとAccess Key IDの設定をしていきましょう。

前段のIAMユーザー作成手順で取得したCSVファイルから、Access Key IDとSecret access keyを確認します。

aws configureコマンドを実行して設定していきます。

$ aws configure
AWS Access Key ID [None]: xxxxxxxxxxxxxxxxxxxx
AWS Secret Access Key [None]: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Default region name [None]: ap-northeast-1
Default output format [None]: json

スポットインスタンス起動スクリプトの作成

以下のコマンドでスポットインスタンスを起動します。

aws ec2 request-spot-instances --instance-count 1 --type "one-time" --launch-specification file://spotrequest.json

このコマンドでは、spotrequest.jsonというファイルを参照します。カレントディレクトリに配置します。

spotrequest.jsonの中身は以下の通りです。

  • ImageId : EC2のAMIs画面から確認したイメージIDを入力します。
  • InstanceType : EC2のインスタンスタイプを入力します。
  • KeyName : EC2のKeyPairs画面から確認したキー名を入力します。
{
    "ImageId": "ami-xxxxxxxxxxxxxxxxx",
    "InstanceType": "c5a.large",
    "KeyName": "xxxxxxxxxx"
}

spotrequest.jsonを作成したら、コマンドを実行してみましょう。

aws ec2 request-spot-instances --instance-count 1 --type "one-time" --launch-specification file://spotrequest.json

処理が正常に終了すると以下のようなJSONが表示されます。

ちなみにこの中に「Spot Instance Request ID」が出力されます。「sir-」から始まる文字列で、後述する「IPアドレスの確認方法(コマンド編)」の中で使用します。

{
    "SpotInstanceRequests": [
        {
            "CreateTime": "2022-08-24T13:36:46.000Z",
            "LaunchSpecification": {
                "SecurityGroups": [
                    {
                        "GroupName": "default",
                        "GroupId": "sg-xxxxxxxx"
                    }
                ],
                "ImageId": "ami-xxxxxxxxxxxxxxx",
                "InstanceType": "c5a.large",
                "KeyName": "xxxxxxxxxxxxxx",
                "Placement": {
                    "AvailabilityZone": "xxxxxxxxxxxx"
                },
                "SubnetId": "subnet-xxxxxxxx",
                "Monitoring": {
                    "Enabled": false
                }
            },
            "ProductDescription": "Linux/UNIX",
            "SpotInstanceRequestId": "sir-xxxxxxxx",
            "SpotPrice": "0.096000",
            "State": "open",
            "Status": {
                "Code": "pending-evaluation",
                "Message": "Your Spot request has been submitted for review, and is pending evaluation.",
                "UpdateTime": "2022-08-24T13:36:46.000Z"
            },
            "Type": "one-time",
            "InstanceInterruptionBehavior": "terminate"
        }
    ]
}

IPアドレスの確認方法(AWS Management Console編)

起動したスポットインスタンスにアクセスするには、グローバルIPアドレスが必要です。

手っ取り早く確認するには、AWS Management Console の EC2 -> Instances を確認します。

IPアドレスの確認方法(コマンド編)

IPアドレスはコマンドからも確認ができます。

まず、以下のコマンドでInstance ID を取得します。引数にSpot Instance Request ID を指定します。Spot Instance Request IDは上述のRequest Spot Instancesコマンドから出力されるJSONに表示されている「sir-」から始まる文字列です。

Spot Instance Request IDが判明したら、以下のコマンドを実行してみましょう。

aws ec2 describe-spot-instance-requests --spot-instance-request-ids sir-xxxxxxxx

コマンド実行に成功すると以下のJSONが表示されます。

次のコマンドでは、この中に表示されている「Instance ID」を使用します。「Instance ID」は「i-」から始まる文字列です。

{
    "SpotInstanceRequests": [
        {
            "CreateTime": "2022-08-26T12:00:33.000Z",
            "InstanceId": "i-xxxxxxxxxxxxxxxxx",
            "LaunchSpecification": {
                "SecurityGroups": [
                    {
                        "GroupName": "default",
                        "GroupId": "sg-xxxxxxxx"
                    }
                ],
                "ImageId": "ami-xxxxxxxxxxxxxxxxx",
                "InstanceType": "c5a.large",
                "KeyName": "xxxxxxxxxxxx",
                "Placement": {
                    "AvailabilityZone": "xxxxxxxxxxxxx"
                },
                "SubnetId": "subnet-xxxxxxxx",
                "Monitoring": {
                    "Enabled": false
                }
            },
            "LaunchedAvailabilityZone": "xxxxxxxxxxxxxx",
            "ProductDescription": "Linux/UNIX",
            "SpotInstanceRequestId": "sir-xxxxxxxx",
            "SpotPrice": "0.096000",
            "State": "active",
            "Status": {
                "Code": "fulfilled",
                "Message": "Your spot request is fulfilled.",
                "UpdateTime": "2022-08-26T12:00:34.000Z"
            },
            "Tags": [],
            "Type": "one-time",
            "ValidUntil": "2022-09-02T12:00:33.000Z",
            "InstanceInterruptionBehavior": "terminate"
        }
    ]
}

Instance ID が判明したら、次は以下のコマンドを実行してみましょう。

aws ec2 describe-instances --instance-id i-xxxxxxxxxxxxxx

以下のようなJSONが返却されれば、成功です。

IPアドレスはPublicIpAddressに記載されています。

{
    "Reservations": [
        {
            "Groups": [],
            "Instances": [
                {
                    "AmiLaunchIndex": 0,
                    "ImageId": "ami-xxxxxxxxxxxxxxxx",
                    "InstanceId": "i-xxxxxxxxxxxxxxxxx",
                    "InstanceType": "c5a.large",

                    (途中省略)

                    "PrivateDnsName": "ip-172-31-xx-xx.ap-northeast-1.compute.internal",
                    "PrivateIpAddress": "172.31.xx.xx",
                    "ProductCodes": [],
                    "PublicDnsName": "ec2-54-65-xx-xx.ap-northeast-1.compute.amazonaws.com",
                    "PublicIpAddress": "54.65.xx.xx",

                    (以下省略)
}

コマンドラインからIPアドレスを確認する方法は以上になります。

お疲れ様でした。

コメント

タイトルとURLをコピーしました