Amazon WorkSpaces コマンドラインによる移行方法をまとめてみた

2021.09.16

今日のひとこと:WSPプロトコルの普及状況はどうなんだろう

はじめに

在宅ワークによるEnd User Computingの利用が定着してきたなか、WorkSpaces(特にMicrosoft Windows)の利用中の方も多いかと思います。継続的に利用する為には、アップデート対応は必須の運用作業です。WorkSpaceのバンドルの移行操作方法として、マネジメントコンソールまたはAWS CLIによる移行が可能です。WorkSpaceリソースが相当数ある場合は、マネジメントコンソールでの作業は厳しいものがあります。
今回は、AWS CLIによるWorkSpaceの移行についてまとめていきます。

移行の事前準備

移行先のバンドルを用意します。移行シナリオを確認してマッチするかどうかは確認しておきましょう。移行の制限事項も上記に記載されますので併せて確認しておきましょう。

次にAWS CLIを実行できる且つjqを利用できる環境を用意します。なぜjqが必要なのかは後ほど説明します。今回はAWS CloudShell環境で試していきます。CloudShellにはAWS CLIおよびjqがプリインストールされています。

$ aws --version
aws-cli/2.2.15 Python/3.8.8 Linux/4.14.243-185.433.amzn2.x86_64 exec-env/CloudShell exe/x86_64.amzn.2 prompt/off
$ jq --version
jq-1.5

移行対象の抽出

移行対象となるWorkSpaceの一覧を aws workspaces describe-workspaces --bundle-id バンドルID で抽出します。 バンドルIDを指定して移行対象のバンドルを利用しているWorkSpaceを抽出できます。 出力される内容は、以下の通りです。指定したバンドルIDで稼働するWorkSpaceが出力されます。

$ aws workspaces describe-workspaces --bundle-id wsb-123456789
{
    "Workspaces": [
        {
            "WorkspaceId": "ws-123456789",
            "DirectoryId": "d-987654321",
            "UserName": "nkhr",
            "IpAddress": "10.xxx.xxx.xxx",
            "State": "AVAILABLE",
            "BundleId": "wsb-123456789",
            "SubnetId": "subnet-444633398222ca111",
            "ComputerName": "DESKTOP-XXXXXXX",
            "WorkspaceProperties": {
                "RunningMode": "AUTO_STOP",
                "RunningModeAutoStopTimeoutInMinutes": 60,
                "RootVolumeSizeGib": 80,
                "UserVolumeSizeGib": 50,
                "ComputeTypeName": "STANDARD"
            },
            "ModificationStates": []
        }
    ]
}

ここから移行に必要となる WorkspaceId だけを抽出したい。このときに便利なツールが jq です。jqは以前の記事で紹介していますので参考にしてください。

また、抽出される数を上限25としてください。これはスクリプトなどで移行する場合、一度に処理できる上限が25であるためです。

スクリプトを使用して WorkSpace を移行する場合、一度に移行できる WorkSpace のバッチの最大数は 25 です。

抽出される数もjqをうまく使って抽出していきます。(jq最高イェーイ)

$ aws workspaces describe-workspaces | jq -r ' [.Workspaces[] | select( .BundleId == "wsb-123456789")] | sort_by(.WorkspaceId) | limit(25; .[]) | .WorkspaceId'
ws-123456789
.
.

これで移行対象のWorkSpaceを抽出できます。

移行コマンド

移行コマンドは、for文で繰り返し処理します。

$ for WorkspaceId in `aws workspaces describe-workspaces | jq -r ' [.Workspaces[] | select( .BundleId == "wsb-123456789")] | sort_by(.WorkspaceId) | limit(25; .[]) | .WorkspaceId'` ; \
> do aws workspaces migrate-workspace --source-workspace-id $WorkspaceId --bundle-id バンドルID >> ./migrate-workspace.json ; \
> done

繰り返し実行されたコマンドの出力は、以下のとおりです。 SourceWorkspaceIdは、移行元のWorkspaceId、TargetWorkspaceIdは、移行先のWorkspaceIdです。

{ 
    "SourceWorkspaceId" : "ws-12345678" 、
    "TargetWorkspaceId" : "ws-87654321" 
}

移行コマンドで migrate-workspace.json ファイルに出力結果を保存しておきます。

移行元WorkSpace削除コマンド

移行先のWorkSpaceがAVAILABLEになったら移行元のWorkSpaceは不要となります。出力結果を保存した migrate-workspace.json からSourceWorkspaceIdを抽出し、以下のコマンドで削除します。

$ for SourceWorkspaceId in `cat ./migrate-workspace.json | jq -r '.SourceWorkspaceId'` ; \
> do aws workspaces terminate-workspaces --terminate-workspace-requests $SourceWorkspaceId ; \
> done

FailedRequestsが出力されなければ成功です。
また、--terminate-workspace-requestsオプションは最大25個のWorkspaceIdを指定できます。上記の移行コマンドとは別に、環境に応じて移行スクリプトを作成する場合の参考にしてください。

まとめ

WorkSpaceの移行方法、特にコマンドラインによる移行方法の一例としてまとめました。移行対象の抽出方法やfor文などは環境に応じて修正して検証してみてください。