ちょっと話題の記事

パラメーターストアから最新のWindows AMIのIDを取得する

2017.11.21

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

中山(順)です

AWS Management Tools Blogにおもしろい記事がありましたので紹介します。

今回紹介するブログはこちらです。

Query for the Latest Windows AMI Using Systems Manager Parameter Store

なお、この記事は上記ブログの翻訳ではなく、内容をざっくり紹介+補足するものとなっております。

概要

ざっくりまとめると以下のような感じです。

  • EC2 Systems Managerの機能であるParameter Storeにパブリックなパラメーターがある
  • Parameter Storeに最新のWindows AMIのIDが保存されている
  • 名前空間/パラメーター名は変わらない(値は随時更新されていく)

Windows AMIの更新周期について

Windowsは、Server/Client共に月例で更新プログラムが配信されています。
AWSにおいては、更新プログラム適用済のAMIが毎月リリースされています。
そのため、インスタンスの新規作成後にWindows Updateで大量の更新プログラムを適用する、なんてことは必要ありません。
これ、地味にうれしいですよね。

ただし、直近から3~4世代のAMIしか利用できないため、例えば1年前に利用したWindows AMIを使ってインスタンスを改めて作成したい、ということができません。(そういったケースを想定する場合は、構築時などに自身でAMIを作成しましょう)

これまでの課題

このようにAMIのメンテナンスはこまめに行われていて非常にありがたいのですが、反面「どのAMIが最新なのか」というのがわかりにくいという問題もありました。

Windows AMIは、英語以外の言語のAMIを提供しており、さらにSQL Serverが含まれていたり、SQL Serverのエディションも複数あったり、Windows Server自体のバージョンも複数あったり、2008以前は32bit版があったり、最近だとNano Serverも使えたり、、、と控えめに言ってカオスです。

やってみた

従来の方法

従来は以下の要領で最新のAMIのIDを取得する必要がありました。

  • パブリックAMIの一覧を取得
  • AMI名で必要なAMIを抽出
  • AMIの作成日でソートし、最新のAMIを特定する

具体的には、以下のようなコマンドで特定します。

aws ec2 describe-images \
    --owners amazon \
    --filters "Name=name,Values=Windows_Server-2016-Japanese-Full-Base*" \
    --query 'sort_by(Images, &CreationDate)[-1].[Name,ImageId]'
[
    "Windows_Server-2016-Japanese-Full-Base-2017.10.13",
    "ami-8127f8e7"
]

このように、AMI名の命名規則やdescribe-imagesサブコマンドのレスポンスなどを踏まえた上でfilterやqueryを書く必要があります。
めんどくさいです。
また、レスポンスがかなり遅いです。(パブリックなAMIは大量にあるので、しょうがないですが)

新たな方法

パブリックなParameter StoreからIDを一発で取得できます。
レスポンスも早いのでストレスはありません。

aws ssm get-parameters \
    --names /aws/service/ami-windows-latest/Windows_Server-2016-Japanese-Full-Base
{
    "InvalidParameters": [],
    "Parameters": [
        {
            "Type": "String",
            "Name": "/aws/service/ami-windows-latest/Windows_Server-2016-Japanese-Full-Base",
            "Value": "ami-8127f8e7"
        }
    ]
}

これを応用して、「最新のWindows AMIでEC2インスタンスを起動する」コマンドを実行することもできます。

aws ec2 run-instances \
    --image-id $(aws ssm get-parameters --names /aws/service/ami-windows-latest/Windows_Server-2016-Japanese-Full-Base  --query 'Parameters[0].[Value]' --output text) \
    --count 1 \
    --instance-type m4.large \
    --subnet-id subnet-xxxxxxxx

また、以下のコマンドで特定のパス配下のパラメーター一覧を取得できます。
(一度に取得できるパラメーターは10件が上限です。next-tokenを指定して追加ページを取得する必要があります。)

aws ssm get-parameters-by-path \
    --path "/aws/service/ami-windows-latest" \
    --query 'Parameters[].[Name,Value]'
[
    [
        "/aws/service/ami-windows-latest/Windows_Server-2008-SP2-English-64Bit-SQL_2008_SP4_Express",
        "ami-2d5c834b"
    ],
    [
        "/aws/service/ami-windows-latest/Windows_Server-2012-R2_RTM-Chinese_Simplified-64Bit-Base",
        "ami-3136e957"
    ],
    [
        "/aws/service/ami-windows-latest/Windows_Server-2012-R2_RTM-Chinese_Traditional-64Bit-Base",
        "ami-3e37e858"
    ],
    [
        "/aws/service/ami-windows-latest/Windows_Server-2012-R2_RTM-Dutch-64Bit-Base",
        "ami-1935ea7f"
    ],
    [
        "/aws/service/ami-windows-latest/Windows_Server-2012-R2_RTM-Japanese-64Bit-Base",
        "ami-3934eb5f"
    ],
    [
        "/aws/service/ami-windows-latest/Windows_Server-2012-RTM-English-64Bit-SQL_2014_SP1_Standard",
        "ami-6d2cf30b"
    ],
    [
        "/aws/service/ami-windows-latest/Windows_Server-2016-English-Core-Containers",
        "ami-b52af5d3"
    ],
    [
        "/aws/service/ami-windows-latest/Windows_Server-2016-English-Core-SQL_2016_SP1_Web",
        "ami-4225fa24"
    ],
    [
        "/aws/service/ami-windows-latest/Windows_Server-2016-English-Full-SQL_2016_Enterprise",
        "ami-5c24fb3a"
    ],
    [
        "/aws/service/ami-windows-latest/Windows_Server-2016-German-Full-Base",
        "ami-5224fb34"
    ]
]

まとめ

これまでめんどうだった最新のWindows AMIのID取得が、これまでより簡単になりました。

また、これ以外にもパブリックなパラメーターが何かあるんじゃないかと気になりました。
何かおもしろいものがあればまたブログに書こうと思います。