EC2のUbuntuのAMIをパラメーターストアから取得する
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件ありました。
結局どれを使えばいいの
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 Livepatch、FIPS/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の中の人が運営しているサークル「じゅ~しぃ~すくりぷと」の本のご案内
技術書コーナー
北海道の駅巡りコーナー