WorkSpaces の Office 2021 が EOL を迎えるので、2024 に移行した話(複数台まとめて実施編)
こんにちは。
いつも心の中にカイル君
運用イノベーション部のかわいです。
前回、Amazon WorkSpaces の Office 2021 が EOL を迎えるということで、1台だけ 2024 に移行してみた話を書きました。
今回はこの続きとして、複数台に展開することを想定し、2台並列で検証した内容を紹介します。
同じような対応が必要な方は、参考にしてみてください。
検証環境
| 項目 | 内容 |
|---|---|
| 台数 | 2台 |
| OS | Windows Server 2022 |
| コンピュートタイプ | STANDARD |
| Running mode | AutoStop |
| *開始時の State | STOPPED |
| 対象アプリ | Microsoft Office LTSC Professional Plus 2021 → 2024 |
前回は AlwaysOn かつ、稼働中(AVAILABLE)の WorkSpace を対象として実施しました。
今回は2台とも STOPPED 状態の WorkSpace を使用しました。
アンインストール(関連付けの解除) → インストール(関連付け)の2段階実行
前回の結果からも、アンインストールとインストールを2段階に分けて実施します。
今回も、AWS CLIからの実行とします。
1. 2021 をアンインストール
※それぞれアプリケーションIDやWorkSpace検証機のIDに、実際の値を置換してください
export AWS_PAGER=""
R="--region ap-northeast-1"
OLD=<Office 2021のアプリケーションID>
LIST="<WorkSpace 検証機AのID> <WorkSpace 検証機BのID>"
echo "PHASE1-START $(date '+%F %T')"
for WS in $LIST; do
aws workspaces disassociate-workspace-application $R --workspace-id $WS --application-id $OLD >/dev/null &&
aws workspaces deploy-workspace-applications $R --workspace-id $WS >/dev/null &&
echo " $WS deployed $(date '+%T')" || echo " $WS FAILED"
sleep 2
done
完了までループで待機
アンインストール完了まで待ちたかったので、以下2点を確認します。
- 2021 の関連付けが消えている(
COMPLETEDまたはREMOVED) - State が
AVAILABLE/STOPPEDに戻っている(アンインストール中の場合はPENDING UNINSTALL等になる)
最終的に以下の形に落ち着きました。
export AWS_PAGER=""
R="--region ap-northeast-1"
OLD=<Office 2021のアプリケーションID>
while :; do
# 1. State を25台ずつバッチ取得
: > st_now.txt
split -l 25 -d targets.txt _st_
for f in _st_*; do
aws workspaces describe-workspaces $R --workspace-ids $(tr '\n' ' ' < $f) \
--query "Workspaces[].[WorkspaceId,State]" --output text >> st_now.txt
sleep 2
done
rm -f _st_*
busy=$(awk '$2!="AVAILABLE" && $2!="STOPPED"' st_now.txt | wc -l)
echo "$(date '+%F %T') 処理中=$busy / $(wc -l < st_now.txt)"
# 2. 全台落ち着いたら関連付けを確認
if [ "$busy" = "0" ]; then
rem=0
while read -r WS; do
a=$(aws workspaces describe-workspace-associations $R --workspace-id "$WS" \
--associated-resource-types APPLICATION \
--query "Associations[?AssociatedResourceId=='$OLD'].State" --output text)
{ [ -n "$a" ] && [ "$a" != "REMOVED" ]; } && rem=$((rem+1))
sleep 1
done < targets.txt
echo " 2021残存=$rem"
[ "$rem" = "0" ] && break
fi
sleep 300
done
sleep を5分間隔にすることで、スロットリングエラーを回避、かつ、
describe-workspaces --workspace-ids は最大25台までまとめて指定できるので、これを使えば State の取得は50台でも2コールで済みます。
さらに、全台完了してから関連付けを確認する構成にすれば、関連付けのコールは毎回挟むことなく最後の1回だけに実施で済みます。
2. 2024 のインストール
2021 のアンインストールが完了したので、次はインストールに進みます。
export AWS_PAGER=""
R="--region ap-northeast-1"
NEW=<Office 2024のID>
LIST="<WorkSpace検証機AのID> <WorkSpace検証機BのID>"
echo "PHASE2-START $(date '+%F %T')"
for WS in $LIST; do
aws workspaces associate-workspace-application $R --workspace-id $WS --application-id $NEW >/dev/null &&
aws workspaces deploy-workspace-applications $R --workspace-id $WS >/dev/null &&
echo " $WS deployed $(date '+%T')" || echo " $WS FAILED"
sleep 2
done
インストール完了まで待機用
export AWS_PAGER=""
R="--region ap-northeast-1"
NEW=<Office 2024のID>
LIST="<WorkSpace検証機AのID> <WorkSpace検証機BのID>"
while :; do
n=0
t=0
err=0
echo "--- $(date '+%F %T')"
for WS in $LIST; do
t=$((t+1))
a=$(aws workspaces describe-workspace-associations $R --workspace-id $WS \
--associated-resource-types APPLICATION \
--query "Associations[?AssociatedResourceId=='$NEW'].State" --output text)
s=$(aws workspaces describe-workspaces $R --workspace-ids $WS \
--query "Workspaces[0].State" --output text)
echo " $WS 2024=${a:-なし} State=$s"
[ "$a" = "COMPLETED" ] && n=$((n+1))
[ "$a" = "ERROR" ] && err=$((err+1))
done
echo " 完了 $n/$t エラー $err"
[ "$n" = "$t" ] && { echo "PHASE2-DONE $(date '+%F %T')" | tee -a test2.log; break; }
[ "$err" -gt 0 ] && { echo "ERROR発生 $(date '+%F %T')" | tee -a test2.log; break; }
sleep 300
done
cat test2.log
結果
両台とも無事に COMPLETED になりました。
--- 2026-09-02 05:04:56
<検証機AのID> 2024=COMPLETED State=STOPPED
<検証機BのID> 2024=COMPLETED State=STOPPED
完了 2/2 エラー 0
今回のタイムライン
| 時刻(GMT) | イベント |
|---|---|
| 04:04:07 | 第1段(アンインストール) |
| 04:05:30 | 両台 State が UPDATING に遷移 |
| 04:21:28 | 検証機A の関連付けが消滅 |
| 04:26:31 | 2台とも関連付け消滅・State が STOPPED に |
| 04:27:20 | 第2段(インストール) |
| 05:04:56 以前 | 2台ともCOMPLETED |
所要時間
| 項目 | 実測 |
|---|---|
| 2021アンインストール | 約22分 |
| 2024インストール | 約35分 |
| 全体 | 約57分 |
前回の1台検証ではインストールまで68分かかっていましたが、検証機はユーザデータがほとんどない状態だったので、
比較的短い検証時間で完了できました。
まとめ的な
複数台への展開時の考え方ですが、基本的には1台のときと同じ方法で実現できました。
強いて言うなら完了確認時の API スロットリングの問題があるので、完了チェックの際のループ処理を少し工夫する必要があります。
完
参考記事
関連記事




