AWS Amplify コンソールによるビルドホストの AL2023 への移行

# はじめに
真・三国無双ORIGINSに嵌ってる [@\_\_\_nix___](https://twitter.com/___nix___) です。
呂布が強過ぎるので難易度下げました(´・ω・｀)

# 背景
さて、AWSを利用していると頻繁に更新の通知が届きますね。
随時対応していかないと後で大変になるのでしっかりと更新していきましょう。
今回はいきなり期限を 2025年2月10日 に設定された Amplify です。

# 概要

```text
2025 年 2 月 10 日より、AWS Amplify コンソールはオペレーティングシステムとして Amazon Linux 2023 (AL2023) を使用するようにビルドホスト群をアップグレードします。
現在、ビルドホストのオペレーティングシステムは Amazon Linux 2 (AL2) です。
Amplify Console が提供する AL2 コンテナイメージは AL2023 ホストと互換性があり、操作を必要とせずに引き続き実行されます。
ビルドでホストオペレーティングシステムが AL2 であることを前提としている場合や、AL2023 で削除されたホストオペレーティングシステムの AL2 機能に依存している場合にのみ、buildspec とカスタムイメージの更新が必要になる可能性があります [1]。
これはホストの特定の OS カーネルバージョンにおけるビルドテストに該当する場合があります。

ご質問やご不明点等ございましたら、AWS サポート [2] までお問い合わせください。

[1] https://docs.aws.amazon.com/linux/al2023/ug/deprecated-al2.html
[2] https://aws.amazon.com/support
```

# 状況確認

まずは現状確認をしたいですね。
以下のスクリプトで一覧を作成できます。

## 確認用スクリプト

```bash
#!/bin/bash
set -e

regions=("ap-northeast-1" "us-east-1")
echo "| リージョン | アプリ名 | アプリID | ブランチ | ビルドホスト | N/A の理由 |"
echo "|------------|----------|-----------|-----------|--------------|------------|"

for region in "${regions[@]}"; do
    apps=$(aws amplify list-apps --region $region --query "apps[].{appId:appId,name:name}" --output json)
    if [ "$apps" == "[]" ]; then
        continue
    fi
    
    echo "$apps" | jq -c '.[]' | while read app; do
        appId=$(echo $app | jq -r '.appId')
        name=$(echo $app | jq -r '.name')
        reason=""
        
        branches=$(aws amplify list-branches --app-id $appId --region $region --query "branches[].branchName" --output json)
        if [ "$branches" == "[]" ] || [ "$branches" == "null" ]; then
            echo "| $region | $name | $appId | N/A | N/A | ブランチが存在しない |"
            continue
        fi
        
        branch=$(echo $branches | jq -r '.[0]')
        
        if [ ! -z "$branch" ]; then
            latestJob=$(aws amplify list-jobs --app-id $appId --branch-name $branch --region $region --max-items 1 --output json)
            jobId=$(echo $latestJob | jq -r '.jobSummaries[0].jobId // empty')
            
            if [ ! -z "$jobId" ]; then
                jobDetails=$(aws amplify get-job --app-id $appId --branch-name $branch --job-id "$jobId" --region $region)
                buildHost=$(echo "$jobDetails" | jq -r '.job.steps[] | select(.stepName=="BUILD") | .context // empty')
                if [ -z "$buildHost" ]; then
                    buildHost="N/A"
                    reason="ビルド情報が取得できない"
                fi
            else
                buildHost="N/A"
                reason="ビルドジョブが存在しない"
            fi
        else
            buildHost="N/A"
            reason="ブランチ名が空"
        fi
        
        if [ "$buildHost" == "N/A" ]; then
            echo "| $region | $name | $appId | $branch | $buildHost | $reason |"
        else
            echo "| $region | $name | $appId | $branch | $buildHost | |"
        fi
    done
done
```

## 実行結果

| リージョン | アプリ名 | アプリID | ブランチ | ビルドホスト | N/A の理由 |
| ----- | ----- | ----- | ----- |----- | ----- |
| ap-northeast-1 | appa | d**** | prod | Image: amplify:al2 | |
| ap-northeast-1 | appb | d**** | prod | Image: amplify:al2023 | |
| us-east-1 | appc | d**** | prod | N/A | ビルド情報が取得できない |
| us-east-1 | appd | d**** | N/A | N/A | ブランチが存在しない |

# 変更

## AWSマネージドコンソール

以下の設定を確認して変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22939/baf23bd2-416d-0ad0-eb5e-8a20a1f77552.png)

実は環境変数の `_CUSTOM_IMAGE` と連動しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22939/c663cf1d-01e2-4551-fbed-34b826ec167d.png)

## AWS CLI

環境変数は Amplify CLI では変更できませんので、AWS CLI を使って直接変更します。

```bash
# 1. 現在の設定を取得
aws amplify get-app --app-id <app_id> --region <region> > app_config.json

# 2. _CUSTOM_IMAGEの値を更新
jq '.app.environmentVariables._CUSTOM_IMAGE = "amplify:al2023"' app_config.json > updated_config.json

# 3. 環境変数を更新
aws amplify update-app \
    --app-id <app_id> \
    --region <region> \
    --environment-variables "$(jq -c '.app.environmentVariables' updated_config.json)"
```

# 終わりに
「更新作業がこれだけ多くなってくるとオンプレと変わらないじゃないか」なんて感じる方もおられるのでしょうか。
でもマネージドサービスを正しく使った方が固定費＋人件費の合計は間違い無くクラウドが勝つと思ってます。

# 一言
政界やメディア、元気が出るような話題が中々無いですね。
ホワイトナイトの登場を心より期待してます、はい。（他力本願）

この記事良かったと少しでも思って頂けたら是非 [@\_\_\_nix___](https://twitter.com/___nix___) をフォローしてあげてください。或いは記事に対してリアクションをお願い致します。