こしあん
2025-08-18

EC2のUbuntuのAMIをパラメーターストアから取得する


2{icon} {views}


UbuntuのAMI IDはSSMパラメーターストアのcanonical配下から取得可能だが、EKSやPro/最小構成などが混在し約1万件と膨大なため絞り込みに工夫が必要。Ubuntu 24.04の最新AMIは /aws/service/canonical/ubuntu/server/24.04/stable/current/{amd64|arm64}/hvm/ebs-gp3/ami-id を参照すればよく、Proは別料金。

はじめに

EC2のAMIのIDはパブリックのSSMパラメーターストアから取得するのがベストプラクティスとなっています。

参考:

Amazon Linux 2023のAMIのIDは容易に取得できますが、Ubuntuの場合はどうするのか?というのを調べてみました。

結論からいうと、取得できますが、canonicalのパラメーターの数があまりに多いのでパブリックパラメーターの検出に工夫が必要でした。

忙しい人向け

Ubuntu 24.04のEC2のAMIを使いたい場合は、アーキテクチャーに応じて以下のどちらか

/aws/service/canonical/ubuntu/server/24.04/stable/current/amd64/hvm/ebs-gp3/ami-id
/aws/service/canonical/ubuntu/server/24.04/stable/current/arm64/hvm/ebs-gp3/ami-id

パブリックパラメーター一覧

パブリックパラメーターとは、AWSが用意している公開しているパラメーターストアで、どのアカウントからも取得することができます。このページに一覧があり、Amazon Linux 2023のAMIのIDの他、ECSやEKS対応のAMIのID用があります。

この中のcanonicalというのが、UbuntuのAMIのIDですが、実はとんでもない量があり(2025年8月時点で1万件弱)、通常の方法では適切なパラメーターを選び出すのが困難な状況です。

canonicalのパラメーター一覧

例えば、マネジメントコンソールからパラメーターストアを開き、パブリックパラメーター→canonicalを選べば出てきますが、

「EKSのAMIが大量に出てきて明らかにこれではない」というページを大量に見るハメになります。AWS CLIでも取得できますが、あまりに多すぎてスロットリングがかかります。

なぜこんなにあるのか

こんなにある理由なのですが、Amazon Linux 2023のパラメーターストアはECSやEKS、通常のEC2のAMIなどの粒度でサービスが分割されているのですが、Ubuntuの場合は全てをcanonicalのサービス以下に押し込めているためです。

boto3で全部取得する

仕方がないので、boto3でcanonicalの以下のパラメーターを全て取得します。スロットリングにかからないように適宜Waitを入れます。

#!/usr/bin/env python3
import argparse
import boto3
from botocore.exceptions import BotoCoreError, ClientError
from pathlib import Path
import time

CANONICAL_PREFIX = "/aws/service/canonical/"
boto_session = boto3.Session(profile_name="develop")


def list_canonical_names_in_region(region: str):
    """describe_parametersで名前のみ取得(値は取らない)/ 50件ずつページング"""
    ssm = boto_session.client("ssm", region_name=region)
    paginator = ssm.get_paginator("describe_parameters")
    params = []
    try:
        for page in paginator.paginate(
            ParameterFilters=[
                {"Key": "Name", "Option": "BeginsWith", "Values": [CANONICAL_PREFIX]}
            ]
        ):
            # 1ページに最大50件
            for p in page.get("Parameters", []):
                name = p.get("Name")
                if name:
                    params.append(name)
            time.sleep(0.5)
    except (BotoCoreError, ClientError) as e:
        print(f"[{region}] error: {e}")
    return params

def get_all_regions():
    """EC2の有効リージョン列挙"""
    ec2 = boto_session.client("ec2")
    resp = ec2.describe_regions()  # 権限により opt-in 済のみ返ることあり
    return sorted(r["RegionName"] for r in resp.get("Regions", []))

def main():
    ap = argparse.ArgumentParser(
        description="List SSM public parameters under /aws/service/canonical/ and write names to text."
    )
    ap.add_argument("--all-regions", action="store_true", help="全リージョンを走査", default=False)
    ap.add_argument("--outfile", default="canonical_params.txt", help="出力ファイル名(単一リージョン時)")
    args = ap.parse_args()

    if args.all_regions:
        # リージョン別に個別ファイルへ出力(衝突防止)
        for region in get_all_regions():
            names = list_canonical_names_in_region(region)
            outfile = Path(f"canonical_params_{region}.txt")
            outfile.write_text("\n".join(sorted(set(names))), encoding="utf-8")
            print(f"[{region}] {len(names)} items -> {outfile}")
    else:
        # 現在のデフォルトリージョン(環境/プロファイルの設定に従う)
        session = boto_session
        region = session.region_name or "us-east-1"  # region未設定時のフォールバック
        names = list_canonical_names_in_region(region)
        Path(args.outfile).write_text("\n".join(sorted(set(names))), encoding="utf-8")
        print(f"[{region}] {len(names)} items -> {args.outfile}")

if __name__ == "__main__":
    main()

これを実行すると、以下のようなファイルにパラメーターリストが出力されます。東京リージョンで9085件ありました。

canonical_params

結局どれを使えばいいの

EC2の場合

Ubuntu 24.04の場合は、以下のパラメーターを取得すれば最新のAMIは取得できそうです。

/aws/service/canonical/ubuntu/server/24.04/stable/current/amd64/hvm/ebs-gp3/ami-id
/aws/service/canonical/ubuntu/server/24.04/stable/current/arm64/hvm/ebs-gp3/ami-id

Ubuntu Proとの違い

いくつか見ていると「Ubuntu」と「Ubuntu Pro」がありますが、Ubuntu Proは別途AMIの課金が発生します。GPT-5に聞いた違いは以下のとおりです。

  • Ubuntu Server:OSそのもの(無償)。LTS 版は“Main”リポジトリのパッケージに5年間の標準セキュリティ更新。
  • Ubuntu Pro(Server 向け):同じ OS に有償/登録制のサブスクリプションを足したもの。10年間(+任意で12年まで拡張可)のセキュリティ維持、“Universe” まで広げたパッケージのCVE対応、Kernel LivepatchFIPS/CISなどのコンプライアンス、Landscape などが付く。個人は5台まで無料で使えます。

どんなパラメーターが収録されているか

/aws/service/canonical/ubuntu以下を見ていくと

  • /aws/service/canonical/ubuntu/eks-pro
  • /aws/service/canonical/ubuntu/eks
  • /aws/service/canonical/ubuntu/pro-minimal
  • /aws/service/canonical/ubuntu/pro-server
  • /aws/service/canonical/ubuntu/server-minimal
  • /aws/service/canonical/ubuntu/server

とあるので、まとめると、

  • 「EKS版、Minimum版、Server版(3種類)」
  • 「Pro版、通常版(2種類)」

の3×2の6種類があることがわかりました。この下にいろんなバージョンのUbuntuのOSが収録されていました。



Shikoan's ML Blogの中の人が運営しているサークル「じゅ~しぃ~すくりぷと」の本のご案内

技術書コーナー

北海道の駅巡りコーナー


Add a Comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です