[AWSからの通知] CodeBuild のビルドホスト移行

# はじめに
最近AWSの様々サービスからの通知が増えましたね。
インフラ運用がメインの [@\_\_\_nix___](https://twitter.com/___nix___)  です。

# 背景
AWSからCodeBiuldに関して次のようなアナウンスが届いたかと思います。

`[Action may be required] AWS CodeBuild migrating build hosts to AL2023 [AWS Account: XXXXXXXXXXXX]`

> Hello,
> 
> Starting on September 4, 2024, AWS CodeBuild will upgrade its fleet of build hosts to use Amazon Linux 2023 (AL2023) from Amazon Linux 2 (AL2) [1]. If your builds rely on AL2 as the underlying operating system, you will need to update your buildspec and any custom images to work with the AL2023. However, if you have already upgraded your buildspec or any custom images you can disregard the rest of this message.
> 
> CodeBuild provides managed container images for AL2023 and contain many of the popular runtimes [2].
> 
> If you have any questions or concerns, please reach out to AWS Support [3].
> 
> [1] https://docs.aws.amazon.com/linux/al2023/ug/deprecated-al2.html
> [2] https://docs.aws.amazon.com/codebuild/latest/userguide/available-runtimes.html#linux-runtimes
> [3] https://aws.amazon.com/support
> 
> Sincerely,
> Amazon Web Services

【日本語訳】
> 2024年9月4日から、AWS CodeBuildはビルドホストをAmazon Linux 2 (AL2) からAmazon Linux 2023 (AL2023) にアップグレードします。ビルドが AL2 に依存している場合、ビルドスペックとカスタムイメージを AL2023 で動作するように更新する必要があります。ただし、ビルド仕様やカスタムイメージをすでにアップグレードしている場合は、このメッセージの残りの部分は無視してかまいません。
> 
> CodeBuild は AL2023 用のマネージドコンテナイメージを提供しており、多くの一般的なランタイムを含んでいます。

これは具体的にどんな内容なのかを確認していきましょう。

# 概要
CodeBuildでビルドを実行するプラットフォームはもちろん何らかのOSを利用しています。

この利用しているOSイメージについてまとめてみました。
判定が NG となっているイメージを利用している場合は更新が必要です。

| プラットフォーム | イメージ識別子 | 判定 | 説明 |
|------------------|-----------------|------|------|
| Amazon Linux 2023 | `aws/codebuild/amazonlinux2-x86_64-standard:5.0` | OK | AL2023ベース。移行不要。 |
| Amazon Linux 2023 | `aws/codebuild/amazonlinux2-aarch64-standard:3.0` | OK | AL2023ベース。移行不要。 |
| Amazon Linux 2 | `aws/codebuild/amazonlinux2-x86_64-standard:corretto11` | NG | AL2ベース。AL2023への移行が必要。 |
| Amazon Linux 2 | `aws/codebuild/amazonlinux2-x86_64-standard:corretto8` | NG | AL2ベース。AL2023への移行が必要。 |
| Amazon Linux 2 | `aws/codebuild/amazonlinux2-x86_64-standard:4.0` | NG | AL2ベース。AL2023への移行が必要。 |
| Amazon Linux 2 | `aws/codebuild/amazonlinux2-x86_64-standard:3.0` | NG | 廃止（2023年5月9日）。更新が必要。 |
| Amazon Linux 2 | `aws/codebuild/amazonlinux2-x86_64-standard:2.0` | NG | 廃止（2022年6月30日）。更新が必要。 |
| Amazon Linux 2 | `aws/codebuild/amazonlinux2-aarch64-standard:2.0` | NG | AL2ベース。AL2023への移行が必要。 |
| Amazon Linux 2 | `aws/codebuild/amazonlinux2-aarch64-standard:1.0` | NG | 廃止（2023年3月31日）。更新が必要。 |
| Ubuntu 20.04 | `aws/codebuild/standard:5.0` | OK | Ubuntuベース。 |
| Ubuntu 22.04 | `aws/codebuild/standard:6.0` | OK | Ubuntuベース。 |
| Ubuntu 22.04 | `aws/codebuild/standard:7.0` | OK | Ubuntuベース。 |
| Ubuntu 18.04 | `aws/codebuild/standard:4.0` | NG | 非推奨（2023年3月31日）。更新が必要。 |
| Ubuntu 18.04 | `aws/codebuild/standard:3.0` | NG | 廃止（2022年6月30日）。更新が必要。 |

注意:
1. 'NG'は更新が必要、'OK'は更新不要を示します。
2. Amazon Linux 2 ベースのイメージは、2024年9月4日以降、Amazon Linux 2023 ベースのイメージに更新される予定です。
3. Ubuntuベースのイメージは、AWSの元のアナウンスでは直接言及されていませんが、バージョン4.0以下は非推奨または廃止となっているため、更新が必要です。
4. 廃止されたイメージは、可能な限り早急に新しいイメージに移行する必要があります。

https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/build-env-ref-available.html

# 確認
さて、アナウンスされたものの、次のアクションが定まらない場合はとにかく以下のスクリプトを実行し、現在の状況を確認してください。

## 確認スクリプト

<details><summary>list_codebuild_images.sh</summary>

```
#!/bin/bash

AWS_REGION="us-west-2"

printf "%-50s %-50s %-15s %s\n" "Project" "Image" "Status" "Action Required"
printf "%-50s %-50s %-15s %s\n" "-------" "-----" "------" "---------------"

projects=$(aws codebuild list-projects --region $AWS_REGION --output json | jq -r '.projects[]')

for project in $projects; do
        image=$(aws codebuild batch-get-projects --names "$project" --region $AWS_REGION --output json | \
                jq -r '.projects[].environment.image')

        case $image in
                "aws/codebuild/standard:4.0" | \
                        "aws/codebuild/standard:3.0")
                status="Deprecated"
                action="Migrate to newer Ubuntu-based image"
                ;;
                "aws/codebuild/amazonlinux2-x86_64-standard:4.0" | \
                        "aws/codebuild/amazonlinux2-x86_64-standard:corretto8" | \
                        "aws/codebuild/amazonlinux2-x86_64-standard:corretto11" | \
                        "aws/codebuild/amazonlinux2-aarch64-standard:2.0")
                status="Update Required"
                action="Migrate to AL2023-based image by Sept 4, 2024"
                ;;
                "aws/codebuild/amazonlinux2-x86_64-standard:3.0" | \
                        "aws/codebuild/amazonlinux2-aarch64-standard:1.0" | \
                        "aws/codebuild/amazonlinux2-x86_64-standard:2.0")
                status="Deprecated"
                action="Migrate to AL2023-based image immediately"
                ;;
                "aws/codebuild/amazonlinux2-x86_64-standard:5.0" | \
                        "aws/codebuild/amazonlinux2-aarch64-standard:3.0" | \
                        "aws/codebuild/standard:5.0" | \
                        "aws/codebuild/standard:6.0" | \
                        "aws/codebuild/standard:7.0")
                status="OK"
                action="No action needed"
                ;;
        *)
                status="Unknown"
                action="Check AWS documentation"
                ;;
esac


printf "%-50s %-50s %-15s %s\n" "$project" "$image" "$status" "$action"
done

echo ""
echo "注意: "
echo "1. 'Deprecated' は非推奨または廃止されたイメージを示し、早急な更新が必要です。"
echo "2. 'Update Required' は2024年9月4日までに更新が必要なイメージを示します。"
echo "3. 'OK' は現在サポートされているイメージを示します。"
echo "4. 'Unknown' は状態が不明なイメージを示します。AWS公式ドキュメントで確認してください。"
echo "5. Amazon Linux 2 ベースのイメージは、2024年9月4日以降、Amazon Linux 2023 ベースのイメージに更新される予定です。"
echo "6. 廃止されたイメージは、可能な限り早急に新しいイメージに移行する必要があり
```
</details>

## 確認結果例

```
$ sh list_codebuild_images.sh
Project  Image                                              Status          Action Required
-------  -----                                              ------          ---------------
Project1 aws/codebuild/amazonlinux2-x86_64-standard:4.0     Update Required Migrate to AL2023-based image by Sept 4, 2024
Project2 aws/codebuild/standard:4.0                         Deprecated      Migrate to newer Ubuntu-based image
Project3 aws/codebuild/standard:7.0                         OK              No action needed
Project4 aws/codebuild/standard:6.0                         OK              No action needed
...
```

# 対応
では判定がNG（スクリプトでOK以外になった）場合はどうすれば良いでしょうか。
実際の対応例を幾つか示しておきます。

## Terraform
aws_codebuild_project の image を新しいイメージに変更します。

```
resource "aws_codebuild_project" "example" {
  # ...

  environment {
    image            = "..." # イメージ設定箇所
```

## CloudFormation
テンプレート内の AWS::CodeBuild::Project リソースを見つけます。
Environment プロパティ内の Image 値を新しいAmazon Linux 2023ベースのイメージに更新します。

```
AWSTemplateFormatVersion: '2010-09-09'
Description: 'AWS CodeBuild Project with updated image'

Resources:
  CodeBuildProject:
    Type: AWS::CodeBuild::Project
    Properties:
      Name: MyProjectName
      Description: An example CodeBuild project
      ServiceRole: !Ref CodeBuildServiceRole
      Artifacts:
        Type: NO_ARTIFACTS
      Environment:
        Type: LINUX_CONTAINER
        ComputeType: BUILD_GENERAL1_SMALL
        Image: aws/codebuild/amazonlinux2023-x86_64-standard:4.0 # イメージ設定箇所
```

## AWS CLI

### 1. 現在のプロジェクト設定を取得
まず、既存のプロジェクト設定をJSONファイルとして取得します。

```
aws codebuild batch-get-projects --names your-project-name > project-config.json
```

### 2. 設定を更新
取得したJSONファイルを編集し、イメージ設定を更新します。環境セクション内の image フィールドを新しいイメージ名に変更します。
例えば、以下のようにイメージを更新します：

```
{
  "projects": [
    {
      "environment": {
        "image": "aws/codebuild/amazonlinux2023-x86_64-standard:4.0",
        ...
      },
      ...
    }
  ]
}
```

### 3. 更新した設定をプロジェクトに適用
編集したJSONファイルを使用して、プロジェクトを更新します。

```
aws codebuild update-project --name your-project-name --cli-input-json file://project-config.json
```

# 終わりに
インフラ運用の業務は様々ですが、クラウド運用もアーキテクチャを設計したり、新しいサービスの研究ばかりではありません。
こういった保守作業もしっかりとアナウンスし、時には自分で作業したりする必要があります。
これらの作業をいかに効率良く進めて行くかも重要です。

そんな中で良い言葉と出会いました。

**「ITエンジニアとは、怠惰を求めて勤勉に行き着くもののことである。」**

https://x.com/beConjuror/status/1828795989295349792

良きかな。

※『哲也-雀聖と呼ばれた男』の原作者である「さいふうめい」氏にも感謝申し上げます。


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