AWS Lightsailで作成したインスタンスを別AZに変更する方法 #reinvent

はじめに

こんにちは、中山です。

今回はLightsailネタです。本エントリでは作成済みLightsailインスタンスを別AZに変更する方法をご紹介します。合わせて、AWS CLIを利用したLightsailの基本的な操作方法も解説します。

概要

該当のドキュメントはこちらです。ドキュメントに書かれている通り、Lightsailで作成したインスタンスを別AZに変更するには、一度スナップショットを作成した後にそのスナップショットからインスタンスを起動させ、同時に起動させるAZを指定する必要があります。現在(2016/12/05)AZを指定したスナップショットからのインスタンス作成はマネジメントコンソールではサポートされておらず、AWS CLIや各種AWS SDKでのみ実施可能です。

今回はAWS CLIを利用した手順をご紹介します。注意点としてLightsailはまだ発表されて間もないサービスのため、お使いのAWS CLIバージョンではサポートされていない場合があります。利用する際はAWS CLIをアップデートしてから試してみてください。

$ pip install --upgrade awscli
$ aws lightsail help

やってみた

まず検証用に適当なインスタンスを立ち上げておきます。このインスタンスはus-east-1bで起動させます。

$ aws lightsail create-instances \
  --instance-names test \
  --availability-zone us-east-1b \
  --blueprint-id wordpress_4_6_1 \
  --bundle-id nano_1_0 \
  --region us-east-1
{
    "operations": [
        {
            "status": "Started",
            "resourceType": "Instance",
            "isTerminal": false,
            "statusChangedAt": 1480905739.066,
            "location": {
                "availabilityZone": "us-east-1b",
                "regionName": "us-east-1"
            },
            "operationType": "CreateInstance",
            "resourceName": "test",
            "id": "8048460d-93a4-4413-9c4e-55935a4138e3",
            "createdAt": 1480905738.208
        }
    ]
}

--blueprint-id オプションでは利用するインスタンスイメージ(ブループリント)を指定します。以下のコマンドを実行することにより指定可能なブループリントの一覧を確認できます。今回はWordpressにしました。

$ aws lightsail get-blueprints \
  --region us-east-1
<snip>

--bundle-id オプションでは利用するインスタンスプランを指定します。以下のコマンドを実行することにより指定可能なプランの一覧を確認できます。今回は一番安いNanoプランにしています。

$ aws lightsail get-bundles \
  --region us-east-1
<snip>

インスタンスのステータスが「running」となれば利用可能です。ステータスは get-instance / get-instances / get-instance-state コマンドで確認できます。

$ $ aws lightsail get-instance-state \
  --instance-name test \
  --region us-east-1
{
    "code": 16,
    "name": "running"
}

続いて、上記インスタンスからスナップショットを作成します。

$ aws lightsail create-instance-snapshot \
  --instance-snapshot-name test-snapshot \
  --instance-name test \
  --region us-east-1
{
    "operations": [
        {
            "status": "Started",
            "resourceType": "InstanceSnapshot",
            "isTerminal": false,
            "operationDetails": "test",
            "statusChangedAt": 1480906889.91,
            "location": {
                "availabilityZone": "all",
                "regionName": "us-east-1"
            },
            "operationType": "CreateInstanceSnapshot",
            "resourceName": "test-snapshot",
            "id": "e028d0ba-bcd5-4615-8bcf-56307cc37305",
            "createdAt": 1480906889.91
        },
        {
            "status": "Started",
            "resourceType": "Instance",
            "isTerminal": false,
            "operationDetails": "test-snapshot",
            "statusChangedAt": 1480906889.91,
            "location": {
                "availabilityZone": "us-east-1b",
                "regionName": "us-east-1"
            },
            "operationType": "CreateInstanceSnapshot",
            "resourceName": "test",
            "id": "8b437fd7-4536-498d-b16c-881565849ced",
            "createdAt": 1480906889.91
        }
    ]
}

しばらくするとスナップショットのステータスが「available」となり利用可能になります。現在のステータスは get-instance-snapshot または get-instance-snapshots で確認可能です。

$ aws lightsail get-instance-snapshot \
  --instance-snapshot-name test-snapshot \
  --region us-east-1
{
    "instanceSnapshot": {
        "fromInstanceName": "test",
        "name": "test-snapshot",
        "sizeInGb": 20,
        "resourceType": "InstanceSnapshot",
        "supportCode": "921850209047/ami-98f9fc8f",
        "fromInstanceArn": "arn:aws:lightsail:us-east-1:************:Instance/48721692-a1ac-45e2-ab4d-75ef9000209a",
        "state": "available",
        "arn": "arn:aws:lightsail:us-east-1:************:InstanceSnapshot/33f3a5eb-3b99-4489-98e3-d8be806de31a",
        "fromBundleId": "nano_1_0",
        "fromBlueprintId": "wordpress_4_6_1",
        "createdAt": 1480906889.91,
        "location": {
            "availabilityZone": "all",
            "regionName": "us-east-1"
        }
    }
}

準備が整いました。このスナップショットからインスタンスを作成し、別AZ(今回はus-east-1c)で立ち上げてみます。

$ aws lightsail create-instances-from-snapshot \
  --instance-names test-from-snapshot \
  --instance-snapshot-name test-snapshot \
  --availability-zone us-east-1c \
  --bundle-id nano_1_0 \
  --region us-east-1
{
    "operations": [
        {
            "status": "Started",
            "resourceType": "Instance",
            "isTerminal": false,
            "statusChangedAt": 1480907407.076,
            "location": {
                "availabilityZone": "us-east-1c",
                "regionName": "us-east-1"
            },
            "operationType": "CreateInstance",
            "resourceName": "test-from-snapshot",
            "id": "18acaed7-d52b-414a-b11e-e5d1453ff697",
            "createdAt": 1480907398.043
        }
    ]
}

注意点として、北部バージニアリージョンは5つのAZがありますが、現在のところLightsailはus-east-1aでは起動できないようです。 --availability-zone にus-east-1aを指定すると以下のようにエラーとなります。

$ aws lightsail create-instances-from-snapshot \
  --instance-names test-from-snapshot \
  --instance-snapshot-name test-snapshot \
  --availability-zone us-east-1a \
  --bundle-id nano_1_0 \
  --region us-east-1

An error occurred (InvalidInputException) when calling the CreateInstancesFromSnapshot operation: Some names are already in use: test-from-snapshot

動作確認として、今回はインスタンスのメタデータを参照してどのAZで起動したのかを確認してみます。今回はデフォルトのSSH秘密鍵を利用したので、その鍵をローカルに保存します。

$ aws lightsail download-default-key-pair \
  --region us-east-1 \
  --query 'privateKeyBase64' \
  --output text \
  > key \
  && chmod 400 key

ローカルに保存したデフォルト秘密鍵を利用してSSHログインし、起動されたAZを確認します。

$ ssh -i key bitnami@"$(
  aws lightsail get-instance \
  --instance-name test-from-snapshot \
  --region us-east-1 \
  --query 'instance.publicIpAddress' \
  --output text)" \
  'curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone'
us-east-1c%

正常にus-east-1cで起動しているようです。やりましたね。

まとめ

いかがだったでしょうか。

Lightsailインスタンスを起動したAZとは異なるAZに変更する方法、およびAWS CLIでの基本的な操作方法をご紹介しました。CLIでWordpressなどが動作済みのインスタンスを素早く起動できるのはかなり便利だなと思った次第です。早く東京リージョンにも欲しいですね。

本エントリがみなさんの参考になれば幸いです。