Amazon WorkSpaces クライアントアプリケーションのカスタマイズをAWS CLIで(やっと)やってみたよの巻(そして、ちょっとバグ情報あるよ)

記事タイトルとURLをコピーする

AWS CLIが好きなテクニカルサポート課の市野です。

前回のブログで、実際にやってみます!とか言いながら、ものすごく日が空いてしまいました。

blog.serverworks.co.jp

本記事中にも記載していますが、私の実行環境で思わぬ落とし穴があり、ロゴ画像のアップロードがまったく動作せず、悶々とした日々を送っていました。(結局AWSサポートに確認した結果、実装バグがあったとのこと。)

それでもAWS CLIで行きたい私は、なんとか気を取り直して、AWS CLIを用いて、Amazon WorkSpacesのクライアントのカスタマイズをやってみました。

前提条件

  • 今回は、--generate-cli-skeleton オプションを使って生成できるフォーマットに準じた JSON ファイルを事前に生成し、--cli-input-json オプションで読み込む形で実施します。
  • WorkSpacesクライアントのOSごとの指定については、内容は基本的に同一※なので、今回はMacOS向けのカスタマイズを実施します。
    ※ただし、iOS用など、同一のデバイス名で複数の解像度が存在するような環境向けには、複数のロゴ画像をアップロードすることができるなど、多少の差異はあります。
  • SupportEmail と SupportLink のパラメータは、どちらか一方しか設定できず、両方が存在しているとエラーとなりますが、今回は SupportLink としました。
  • ロゴ画像は png 形式のみに対応しているので、今回は以下の画像を用意しました。

実行環境について

OS

% sw_vers
ProductName:    macOS
ProductVersion: 12.4
BuildVersion:   21F79

シェル

% zsh --version
zsh 5.8.1 (x86_64-apple-darwin21.0)

AWS CLI

% aws --version
aws-cli/2.7.2 Python/3.9.11 Darwin/21.5.0 exe/x86_64 prompt/off

処理の実行

変数の設定

後続の処理で利用したいパラメータを事前に変数に設定しておきます。

# WorkSpacesディレクトリドメイン文字列の指定
DOMAIN=hoge.testdomain.com

# インポート用JSONファイル フルパスの指定
MACOS_IMPORT_JSON=${HOME}/Documents/WorkSpaces/macos.json

# ロゴ画像ファイル フルパスの指定
LOGO=${HOME}/Documents/WorkSpaces/macos_logo.png

Directory IDの取得

以下のコマンドで、client brandingを設定したいドメインのディレクトリIDを取得します。

DIRECTORY_ID=$(aws workspaces describe-workspace-directories \
  --query "Directories[?contains(DirectoryName,\`${DOMAIN}\`)].DirectoryId" \
  --output text) \
  && echo ${DIRECTORY_ID}
# 結果として以下のように表示されればOK
d-xxxxxxxxxx

インポート用JSONファイルの作成

以下のコマンドで、指定のロゴ画像をbase64エンコードしつつ、インポート用JSONファイルとして作成・内容の確認をします。

なお、今回のハマりどころ1つ目として、base64エンコードした結果の文字列は必ず「"(ダブルクォート)」で囲む必要がありました。

cat << EOF > ${MACOS_IMPORT_JSON}
{
    "ResourceId": "${DIRECTORY_ID}",
    "DeviceTypeOsx": {
        "Logo": "$(base64 ${LOGO})",
        "SupportLink": "https://support.example.com",
        "ForgotPasswordLink": "https://support.example.com/forgot/",
        "LoginMessage": {
            "en_US": "テストの文字列"
        }
    }
}
EOF
cat ${MACOS_IMPORT_JSON}

# 以下のようにJSONファイルの内容が表示されればOK
{
    "ResourceId": "d-xxxxxxxxxx",
    "DeviceTypeOsx": {
        "Logo": "iVBORw...{中略}...==",
        "SupportLink": "https://support.example.com",
        "ForgotPasswordLink": "https://support.example.com/forgot/",
        "LoginMessage": {
            "en_US": "テストの文字列"
        }
    }
}

処理の実行

import-client-branding サブコマンドを実行し、MacOS用クライアントアプリのカスタマイズを実施して行きたいと思います。

aws workspaces import-client-branding \
  --cli-input-json file://${MACOS_IMPORT_JSON}

# 以下のような返り値が表示されれば正しく登録が完了しています。
{
    "DeviceTypeOsx": {
        "LogoUrl": "https://d3v7kcib8ir2e1.cloudfront.net/prod/${DIRECTORY_ID}/workspaces-branded-logo-osx.png",
        "SupportLink": "https://support.example.com",
        "ForgotPasswordLink": "https://support.example.com/forgot/",
        "LoginMessage": {
            "en_US": "テストの文字列"
        }
    }
}

処理の実行結果…、の前に、今回ものすごくハマったところ

上記までを作業手順として組み立てて処理の実行を行っていたものの、当初以下のようなエラーが発生していました。

エラー1

Error parsing parameter 'cli-input-json': Invalid JSON: Expecting value: line 4 column 17 (char 75)

こちらは、AWSサポートに問い合わせた結果、ロゴ画像のbase64エンコード文字列を「"(ダブルクォート)」で囲んでいなかったことが問題だと判明しました。

エラー2

An error occurred (InvalidParameterValuesException) when calling the ImportClientBranding operation: One or more input values are incorrect. Please verify your input and try again.

こちらのエラーが根深く、私の環境で、前述のエラー1の内容を是正してもまったく処理がうまくいかず、悶々としていた部分です。

いろいろと試しても結果が変わらず、AWSサポートへ泣きついたところ、実施していたタイミングではAWS CLIの1系(1.22.96)を利用していたためエラー発生していたようでした。

さらに、AWSサポートで検証いただいた結果では、複数のv1環境で等しくエラーが出ているようで、どうも AWS CLI v1 で発生する事象とみられるとのことです。(2022年5月25日現在)

上記の通り、AWS側でも認識はいただけてはいますが、実装の修正が完了するまで、バージョン1系をお使いの場合は、ロゴ画像のアップロード部分のみ注意が必要です。

なお、 WorkSpace ブランドのカスタマイズ に記載がある、その他の言語でのサンプルスクリプト(Pythonなどの例)では問題がなさそうでした。

処理の実行結果

AWS CLIでの実行にこだわったため、ものすごく時間がかかりましたが、カスタマイズをしてみた結果が以下の通りです。

また、MacOS版で、私の環境での表示結果からの推察ですが、少なくともMacOS版のロゴ画像の最大サイズは、330 x 50(ピクセル / 横 x 縦 )のようでした。

なお、画像では表現ができないところですが、「パスワードを忘れた場合」リンクは「ForgotPasswordLink」に設定したURLに、メニューバーの「サポート」→「フィードバックを送信」をクリックした際の挙動は「SupportLink」に設定したURLに、それぞれ変わっていました。

まとめ

AWS CLIv1ではエラーが出るものの、ロゴ画像や各種リンクを変更することが可能になっています。

プラットフォームごとに設定をする必要はありますが、AWSに直接問い合わせをしてほしくないなど、利用者の行動を統制したい場合など、運用マニュアルだけでは制御しきれなかった部分を物理的に書き換えて提供することができるので、WorkSpacesを導入している企業様でお使いいただける機能だと思います。