AWS CLIからLightsailのスナップショットを作成する

仮想プライベートサーバー(VPS)を簡単に利用できる Amazon Lightsail は

  • インスタンス(EC2 の AMI 相当)
  • ストレージ(EC2 の EBS 相当)

の粒度でスナップショットを作成できます。

今回は AWS CLI からこれらのスナップショットを作成する方法を紹介します。

Cloudwatch EventsLambda を連携させて、定期実行する方法は次の記事を参照ください。

Cloudwatch EventsとLambdaでLightsailのスナップショットを定期取得する | Developers.IO

前提

Amazon Lightsail のテンプレートから WordPress インスタンス(WP)を起動し、別途、8GB のディスク(MyDisk)をアタッチしているものとします。

$ aws lightsail get-instance --instance-name WP
{
    "instance": {
        "resourceType": "Instance",
        ...
        "blueprintId": "wordpress_4_9_6",
        "name": "WP",
        "hardware": {
            "disks": [
                {
                    "iops": 100,
                    "attachmentState": "attached",
                    "createdAt": 1530982976.689,
                    "sizeInGb": 20,
                    "path": "/dev/sda1",
                    "attachedTo": "WP",
                    "isSystemDisk": true
                },
                {
                    "resourceType": "Disk",
                    "attachmentState": "attached",
                    "isAttached": true,
                    "name": "MyDisk",
                    "state": "in-use",
                    "path": "/dev/xvdf",
                    "attachedTo": "WP",
                    ...
                }
            ],
            ...
        },
        "blueprintName": "WordPress",
        ...
    }
}

インスタンスのスナップショット

create-instance-snapshot API を使い、対象のインスタンス名(--instance-name)とスナップショット名(--instance-snapshot-name)を指定します。

$ aws lightsail create-instance-snapshot \
  --instance-name WP \
  --instance-snapshot-name WP-test
{
    "operations": [
        {
            "operationDetails": "WP",
            "status": "Started",
            "createdAt": 1530992189.634,
            "id": "7aec100d-ac2f-4266-b4de-833ceea8d1c8",
            "resourceType": "InstanceSnapshot",
            "operationType": "CreateInstanceSnapshot",
            "isTerminal": false,
            "location": {
                "availabilityZone": "all",
                "regionName": "eu-central-1"
            },
            "resourceName": "WP-test",
            "statusChangedAt": 1530992189.634
        },
        {
            "operationDetails": "WP-test",
            "status": "Started",
            "createdAt": 1530992189.634,
            "id": "2a2d6f9f-6c4b-4f04-8081-c872dacb93f0",
            "resourceType": "Instance",
            "operationType": "CreateInstanceSnapshot",
            "isTerminal": false,
            "location": {
                "availabilityZone": "eu-central-1a",
                "regionName": "eu-central-1"
            },
            "resourceName": "WP",
            "statusChangedAt": 1530992189.634
        }
    ]
}

作成したスナップショットを get-instance-snapshots API で確認します。

$ aws lightsail get-instance-snapshots
{
    "instanceSnapshots": [
        {
            "name": "WP-test",
            "location": {
                "regionName": "eu-central-1",
                "availabilityZone": "all"
            },
            "createdAt": 1530992189.634,
            "state": "available",
            "fromBundleId": "nano_1_0",
            "arn": "arn:aws:lightsail:eu-central-1:123456789012:InstanceSnapshot/d831c28d-9c7f-4c7b-88e5-7d6b82114c4b",
            "fromInstanceArn": "arn:aws:lightsail:eu-central-1:123456789012:Instance/41abddc4-62b5-4d5a-8355-e5e674b01b65",
            "fromBlueprintId": "wordpress_4_9_6",
            "resourceType": "InstanceSnapshot",
            "fromInstanceName": "WP",
            "fromAttachedDisks": [
                {
                    "path": "/dev/xvdf",
                    "name": "MyDisk",
                    "sizeInGb": 8
                }
            ],
            "sizeInGb": 20,
            "supportCode": "174337882580/ami-ec8db707"
        }
    ]
}

create-instances-from-snapshot API を使い、取得済みスナップショット名(--instance-snapshot-name)と新規インスタンス名(--instance-name)を指定し、インスタンスをリストアします。

$ aws lightsail create-instances-from-snapshot --instance-names restored-WP \
> --availability-zone eu-central-1a \
> --instance-snapshot-name WP-test \
> --bundle-id nano_1_0
{
    "operations": [
        {
            "status": "Started",
            "isTerminal": false,
            "location": {
                "availabilityZone": "eu-central-1a",
                "regionName": "eu-central-1"
            },
            "operationType": "CreateInstancesFromSnapshot",
            "createdAt": 1530993202.452,
            "resourceName": "restored-WP",
            "id": "9fa98e12-0025-4e46-839c-c0cd1ab969ef",
            "resourceType": "Instance",
            "statusChangedAt": 1530993202.452
        }
    ]
}

--bundle-id はプライスプラント設定を紐付けます。プランをかえない場合、既存のものを流用します。 バンドル情報は スナップショットに "fromBundleId": "nano_1_0" というように含まれています。

バンドルの一覧は次の API から確認可能です。

$ aws lightsail get-bundles
{
    "bundles": [
        {
            "instanceType": "nano",
            "cpuCount": 1,
            "diskSizeInGb": 20,
            "supportedPlatforms": [
                "LINUX_UNIX"
            ],
            "price": 5.0,
            "isActive": true,
            "transferPerMonthInGb": 1024,
            "ramSizeInGb": 0.5,
            "name": "Nano",
            "power": 300,
            "bundleId": "nano_1_0"
        },
...
}

最後に不要になったスナップショットを delete-instance-snapshot API で削除します。

$ aws lightsail delete-instance-snapshot --instance-snapshot-name WP-test
{
    "operations": [
        {
            "createdAt": 1530993349.468,
            "resourceName": "WP-test",
            "status": "Succeeded",
            "isTerminal": true,
            "id": "fc2d36a9-9e2a-4444-a4fb-0077e7a629b9",
            "resourceType": "InstanceSnapshot",
            "location": {
                "availabilityZone": "all",
                "regionName": "eu-central-1"
            },
            "operationType": "DeleteInstanceSnapshot",
            "statusChangedAt": 1530993349.468
        }
    ]
}

ディスクのスナップショット

create-disk-snapshot API を使い、対象のインスタンス名(--disk-name)とスナップショット名(--disk-snapshot-name)を指定します。

$ aws lightsail create-disk-snapshot \
  --disk-name MyDisk \
  --disk-snapshot-name MyDisk-test
{
    "operations": [
        {
            "resourceName": "MyDisk-test",
            "isTerminal": false,
            "statusChangedAt": 1530992294.397,
            "operationDetails": "MyDisk",
            "location": {
                "regionName": "eu-central-1",
                "availabilityZone": "all"
            },
            "id": "abcb5977-3ec5-4097-b81e-848519feda48",
            "status": "Started",
            "operationType": "CreateDiskSnapshot",
            "createdAt": 1530992294.397,
            "resourceType": "DiskSnapshot"
        },
        {
            "resourceName": "MyDisk",
            "isTerminal": false,
            "statusChangedAt": 1530992294.397,
            "operationDetails": "MyDisk-test",
            "location": {
                "regionName": "eu-central-1",
                "availabilityZone": "eu-central-1a"
            },
            "id": "e1434553-f382-47bb-82be-346ae689cb0b",
            "status": "Started",
            "operationType": "CreateDiskSnapshot",
            "createdAt": 1530992294.397,
            "resourceType": "Disk"
        }
    ]
}

作成したスナップショットを get-disk-snapshots API で確認します。

$ aws lightsail get-disk-snapshots
{
    "diskSnapshots": [
        {
            "createdAt": 1530992294.397,
            "progress": "100%",
            "sizeInGb": 8,
            "fromDiskName": "MyDisk",
            "location": {
                "regionName": "eu-central-1",
                "availabilityZone": "all"
            },
            "arn": "arn:aws:lightsail:eu-central-1:123456789012:DiskSnapshot/d3c29f0b-0e1e-41ce-bfd6-cd763e43e556",
            "state": "completed",
            "fromDiskArn": "arn:aws:lightsail:eu-central-1:123456789012:Disk/10872187-8d3e-4149-b6fa-4561087ca960",
            "supportCode": "174337882580/snap-093e2fec86780e52b",
            "name": "MyDisk-test",
            "resourceType": "DiskSnapshot"
        }
    ]
}

create-disk-from-snapshot API を使い、取得済みスナップショット名(--disk-snapshot-name)と新規ディスク名(--disk-name)を指定し、ディスクをリストアします。

アタッチ先インスタンスと同じアベイラビリティゾーン(--availability-zone)を指定してください。

ディスクのサイズ(--size-in-gb)は取得済みスナップショット以上のサイズのみ指定可能です。

$ aws lightsail create-disk-from-snapshot \
  --disk-name restored-disk \
  --disk-snapshot-name MyDisk-test \
  --availability-zone eu-central-1a \
  --size-in-gb 10
{
    "operations": [
        {
            "id": "c344fb69-64ce-46c1-ab21-7c77e7967b38",
            "location": {
                "availabilityZone": "eu-central-1a",
                "regionName": "eu-central-1"
            },
            "createdAt": 1530992810.275,
            "isTerminal": false,
            "operationType": "CreateDiskFromSnapshot",
            "resourceName": "restored-disk",
            "resourceType": "Disk",
            "status": "Started",
            "statusChangedAt": 1530992810.616
        }
    ]
}

最後に不要になったスナップショットを delete-disk-snapshot API で削除します。

$ aws lightsail delete-disk-snapshot --disk-snapshot-name MyDisk-test
{
    "operations": [
        {
            "resourceType": "DiskSnapshot",
            "statusChangedAt": 1530993308.209,
            "isTerminal": true,
            "createdAt": 1530993308.209,
            "resourceName": "MyDisk-test",
            "status": "Succeeded",
            "id": "61fb5779-379f-4f8e-ac45-76f4c4111de4",
            "location": {
                "availabilityZone": "all",
                "regionName": "eu-central-1"
            },
            "operationType": "DeleteDiskSnapshot"
        }
    ]
}

まとめ

Amazon Lightsail のインスタンス・ディスクのスナップショットの作成・リストアを AWS CLI から行う方法を紹介しました。

Lightsail 運用の際は、これらを参考に、要件に合わせてスナップショットの取得を実装ください。

また、AWS からスナップショットの作成を定期実行する CloudFormation テンプレートが提供されています。 このテンプレートを利用すると、作り込み負荷が軽減されます。 詳細は次の記事を参考ください。

Cloudwatch EventsとLambdaでLightsailのスナップショットを定期取得する | Developers.IO

参考