いろいろなシチュエーションでのWindows AMIの選び方について整理してみた

EC2インスタンスで利用できるWindowsのAMIには、意外と多くの種類が存在します。どのような種類があるのか、どのように選べばよいのかを整理しました。
2020.04.20

みなさん、こんにちは!
AWS事業本部の青柳@福岡オフィスです。

WindowsのEC2インスタンスを構築する際に

「どのAMIから起動すれば良いんだっけ?」
「AMIは分かったけど、対応するAMI IDを確認するのが面倒」

など、その都度調べるのが手間だったので、備忘録を兼ねて整理してみました。

Windows AMIを検索する

マネジメントコンソールの「EC2」→「AMI」から、Windows AMIの一覧を検索することができます。

使用可能な全てのWindows AMIの一覧を検索するには、「パブリックイメージ」を選択して、フィルター条件を以下のように指定します。

  • 所有者: Amazonイメージ
  • プラットフォーム: Windows
  • AMI名: Windows_Server

ただし、検索結果が数百件もありますので、この中から目的のAMIを探すためには、更なる条件の絞り込みが必要になります。

条件を絞り込むためには、AMIの「名前」(AMI名) の命名規則を理解することがポイントです。

Windows AMIの「AMI名」命名規則

例外もありますが、Windows AMIの「AMI名」は概ね以下の命名規則となっています。

各項目について説明します。

OSの種類

Windows AMIは基本的にWindows_Serverで始まる名前となっています。

なお、「windows」プラットフォームのAMIにはWindows_Server以外の名前が付いたものも存在します。
例えば、AWS Elastic Beanstalk用のAMIなどが該当しますが、今回は説明を割愛します。

Windowsバージョン

現在、AWSから提供されているAMIは以下のバージョンです。
(2008 R2以前のバージョンは、マイクロソフトのサポート終了に伴い、AMIが提供されなくなりました)

  • 2012-RTM: Windows Server 2012
  • 2012-R2_RTM: Windows Server 2012 R2
  • 2016: Windows Server 2016
  • 2019: Windows Server 2019

上記のもの以外に180919031909といったバージョン番号が付いたAMIが存在します。
これらはWindows Serverの「半期チャネル」(SAC) と呼ばれる製品体系のAMIです。

半期チャネルについては、以下のリンク先を参照してください。
Windows Server サービス チャネル: LTSC と SAC | Microsoft Docs
【新機能】Amazon EC2でWindows Server バージョン1809が使えるようになりました #reinvent | Developers.IO

言語

JapaneseEnglishなどの言語毎のAMIが用意されています。

日本語版のアプリケーションやミドルウェアを動作させる場合、互換性やサポートの対象が日本語Windowsに限定される場合があります。
そのような場合にはJapaneseを選択します。

AMIのバリエーションによっては、用意されている言語が英語版のみである場合もあります。

インストールオプション

Windows Server 2016以降の場合、FullCoreの選択肢があります。
Windows Server 2012 R2以前の場合、この項目は64Bitで固定であり、Full相当になります。

  • Full: GUIを備えた通常のインストール
  • Core: GUIが省略された「Windows Server Core」インストール

Windows Server Coreインストールオプションは、GUIが無くCLIベースの管理が必要ですが、OSのコンポーネントが必要最低限に絞られているため「軽量」「セキュリティ更新で受ける影響が少ない」などのメリットがあります。

(※ Coreは英語版のみ用意されており、日本語版の場合は必然的にFullの選択となります)

Windows Server Coreについての詳細は、以下のリンク先を参照してください。
Windows Server の Server Core インストールオプションとは | Microsoft Docs

バリエーション

通常は、基本となるBaseのAMIを選択します。

その他に、利用目的に応じて、コンポーネントが追加されていたり、カスタマイズが施されたりしたAMIのバリエーションが用意されています。

代表的なものとして、Microsoft SQL ServerがインストールされたAMIがあります。

(※ BaseSQL以外のバリエーションは原則として英語版のみが用意されています)

個々のバリエーションの詳細については、後ほど説明します。

ビルド日付

Windows AMIは、原則として、マイクロソフトの「セキュリティ更新プログラム (月例)」のリリースに合わせて、最新のセキュリティ更新プログラムが適用されたAMIがAWSによってビルド・公開されます。

過去のビルドが一定期間 (通常は4か月分=4世代分) 履歴として公開されており、期間を過ぎた古いビルドはAMIのリストから削除されます。
通常は最新のビルドを選択すれば問題ありませんが、必要に応じて古いビルドを選択することも可能です。

例えば、2020/4/15時点では以下のビルドが公開されています。(AMIの種類によって若干異なります)

  • 2020.04.15
  • 2020.03.18 (※ Windows Server 2019のみ)
  • 2020.03.11
  • 2020.02.12
  • 2020.01.15

(Windows Server 2019のAMIは3月に2回更新されているため、例外的に5世代分が公開されている状態となっています)

「Base」以外のAMIのバリエーション

SQL: Microsoft SQL Serverがインストール済みのAMI

例: Windows_Server-2019-Japanese-Full-SQL_2017_Standard

SQLの後にはSQL Serverのバージョン・エディションが続きます。

Windowsのバージョンや言語によって組み合わせ可能なSQL Serverのバージョン・エディションが異なることに注意してください。

(後述の「AWS CLIを使ってWindows AMIを検索する」に、SQL Serverインストール済みAMIを検索する例を記載しています)

Tesla: GPUインスタンス向けAMI

例: Windows_Server-2019-English-Tesla

Windows高速コンピューティングインスタンス (GPUベースインスタンス) のためのドライバーがインストール済みのAMIです。

Windows 高速コンピューティングインスタンス - Amazon Elastic Compute Cloud

Deep-Learning: Deep Learning向けAMI

例: Windows_Server-2019-English-Deep-Learning

ディープラーニングのフレームワーク (Tensorflow、Caffe、MXNet) が導入済みのAMIです。

AWS Deep Learning AMI とは - Deep Learning AMI
【速報】AWS Deep Learning AMI for Microsoft Windowsがリリースされました #reinvent | Developers.IO

ECS_Optimized: ECS向けAMI

例: Windows_Server-2019-English-Core-ECS_Optimized

ECSでWindowsコンテナを利用する場合のホストインスタンス用途に最適化されたAMIです。

Windows コンテナ - Amazon Elastic Container Service

EKS_Optimized: EKS向けAMI

例: Windows_Server-2019-English-Core-EKS_Optimized-1.14Windows_Server-2019-English-Core-EKS_Optimized-1.15

EKSでWindowsコンテナを利用する場合のワーカーノード用途に最適化されたAMIです。

Amazon EKS Windows ワーカーノードの起動 - Amazon EKS
[アップデート] EKSでWindowsワーカーノードの実行が正式サポートされました! | Developers.IO

ContainersLatest: Windows Serverコンテナ導入済みAMI

例: Windows_Server-2019-English-Core-ContainersLatestWindows_Server-2019-English-Full-ContainersLatest

「Windows Serverコンテナ」機能、およびDocker (DockerMicrosoftProvider) が導入済みのAMIです。
(ECSやEKSを使わずにDockerを単体で利用する場合は、こちらのAMIとなります)

HyperV: Hyper-V導入済みAMI

例: Windows_Server-2019-English-Full-HyperV

「Hyper-V」の役割が導入済みのAMIです。

STIG: STIGsに準拠したAMI

例: Windows_Server-2019-English-STIG-FullWindows_Server-2019-English-STIG-Core

「STIGs」とは、アメリカ国防情報システム局が提供するチェックリスト/ベストプラクティス集です。
STIGsに準拠したAMIを利用することで、セキュリティのリスクを低減することが期待できます。

STIGsについての詳細は、以下のリンク先を参照してください。
Security Technical Implementation Guides (STIGs)に準拠したWindows Serverを追加費用無しで利用できるようになりました | Developers.IO
[re:Invent2019] EC2 Image BuilderのWindows STIGコンポーネントを調べてみた #reinvent | Developers.IO

AWS CLIを使ってWindows AMIを検索する

ここまでで説明したAMI名の要素を条件に指定してマネジメントコンソールから検索しても良いのですが、AWS CLIを使うとよりスピーディーに目的のAMIを探すことができます。

例1: Windows Serverの各バージョンにおいて、日本語版で提供されているAMIの一覧を表示

aws ec2 describe-images \
  --region ap-northeast-1 \
  --owners amazon \
  --filters "Name=platform,Values=windows" \
            "Name=name,Values=Windows_Server-*-Japanese-*-Base-*" \
  --query "sort_by(Images, &Name)[].[ImageId, Name]" \
  --output text
ami-0540dc7dc61e196c8   Windows_Server-2012-R2_RTM-Japanese-64Bit-Base-2020.01.15
ami-0d56b8074c6e165c6   Windows_Server-2012-R2_RTM-Japanese-64Bit-Base-2020.02.12
ami-0e1285bf6d715a8d6   Windows_Server-2012-R2_RTM-Japanese-64Bit-Base-2020.03.11
ami-0ad982fce4f5d83a7   Windows_Server-2012-R2_RTM-Japanese-64Bit-Base-2020.04.15
ami-0ce892616bddab3a9   Windows_Server-2012-RTM-Japanese-64Bit-Base-2020.01.15
ami-09d956b6c7faf7526   Windows_Server-2012-RTM-Japanese-64Bit-Base-2020.02.12
ami-0b91b3c756034434c   Windows_Server-2012-RTM-Japanese-64Bit-Base-2020.03.11
ami-0b5e36c15ba9654e3   Windows_Server-2012-RTM-Japanese-64Bit-Base-2020.04.15
ami-01e9f9c59f39f1ce6   Windows_Server-2016-Japanese-Full-Base-2020.01.15
ami-08648ecc74e83e435   Windows_Server-2016-Japanese-Full-Base-2020.02.12
ami-0854f81cb0aa924ba   Windows_Server-2016-Japanese-Full-Base-2020.03.11
ami-01577fa45c2d60eaf   Windows_Server-2016-Japanese-Full-Base-2020.04.15
ami-094418f0b70398775   Windows_Server-2019-Japanese-Full-Base-2020.01.15
ami-086ada1a922a166bd   Windows_Server-2019-Japanese-Full-Base-2020.02.12
ami-0e47cca1c10f59db5   Windows_Server-2019-Japanese-Full-Base-2020.03.11
ami-0eaf2cee98a021942   Windows_Server-2019-Japanese-Full-Base-2020.03.18
ami-092bd66a9b5bcf165   Windows_Server-2019-Japanese-Full-Base-2020.04.15

例2: 日本語版のWindows Server 2016と組み合わせ可能なSQL Serverの一覧を表示

aws ec2 describe-images \
  --region ap-northeast-1 \
  --owners amazon \
  --filters "Name=platform,Values=windows" \
            "Name=name,Values=Windows_Server-2016-Japanese-*-SQL_*" \
  --query "sort_by(Images, &Name)[].[ImageId, Name]" \
  --output text
ami-0dba8408ca6a12e12   Windows_Server-2016-Japanese-Full-SQL_2016_SP2_Enterprise-2020.01.15
ami-0e81bc7507bee2d64   Windows_Server-2016-Japanese-Full-SQL_2016_SP2_Enterprise-2020.02.12
ami-04f40635c94f3aee2   Windows_Server-2016-Japanese-Full-SQL_2016_SP2_Enterprise-2020.03.11
ami-034eda9f332550e26   Windows_Server-2016-Japanese-Full-SQL_2016_SP2_Enterprise-2020.04.15
ami-048e9fa096f35082c   Windows_Server-2016-Japanese-Full-SQL_2016_SP2_Express-2020.01.15
ami-0a6ffe4beaeb4b750   Windows_Server-2016-Japanese-Full-SQL_2016_SP2_Express-2020.02.12
ami-0d952aeec03c11c72   Windows_Server-2016-Japanese-Full-SQL_2016_SP2_Express-2020.03.11
ami-04912fb6ef6893cc7   Windows_Server-2016-Japanese-Full-SQL_2016_SP2_Express-2020.04.15
ami-04c064d2e72662c7b   Windows_Server-2016-Japanese-Full-SQL_2016_SP2_Standard-2020.01.15
ami-0000bf8b99cfbf565   Windows_Server-2016-Japanese-Full-SQL_2016_SP2_Standard-2020.02.12
ami-007fc9dfe417e8183   Windows_Server-2016-Japanese-Full-SQL_2016_SP2_Standard-2020.03.11
ami-047ba237f9f0fa48f   Windows_Server-2016-Japanese-Full-SQL_2016_SP2_Standard-2020.04.15
ami-075502341d1c0ea6c   Windows_Server-2016-Japanese-Full-SQL_2016_SP2_Web-2020.01.15
ami-08fddcfaefd05a047   Windows_Server-2016-Japanese-Full-SQL_2016_SP2_Web-2020.02.12
ami-0af6eba119c258d94   Windows_Server-2016-Japanese-Full-SQL_2016_SP2_Web-2020.03.11
ami-003d796e504ae947c   Windows_Server-2016-Japanese-Full-SQL_2016_SP2_Web-2020.04.15
ami-02737105cf6da1dbc   Windows_Server-2016-Japanese-Full-SQL_2017_Enterprise-2020.01.15
ami-0111b96cffa452cbc   Windows_Server-2016-Japanese-Full-SQL_2017_Enterprise-2020.02.12
ami-0917e050aad90dc76   Windows_Server-2016-Japanese-Full-SQL_2017_Enterprise-2020.03.11
ami-066cf5cae74a060e9   Windows_Server-2016-Japanese-Full-SQL_2017_Enterprise-2020.04.15
ami-06ffb2c6693099a73   Windows_Server-2016-Japanese-Full-SQL_2017_Standard-2020.01.15
ami-0e46381e0b6a58a58   Windows_Server-2016-Japanese-Full-SQL_2017_Standard-2020.02.12
ami-0736c12ec83822583   Windows_Server-2016-Japanese-Full-SQL_2017_Standard-2020.03.11
ami-0a99a9af0fa7b9a3b   Windows_Server-2016-Japanese-Full-SQL_2017_Standard-2020.04.15
ami-0945561d79d1ba382   Windows_Server-2016-Japanese-Full-SQL_2017_Web-2020.01.15
ami-02dfa1cc49889231d   Windows_Server-2016-Japanese-Full-SQL_2017_Web-2020.02.12
ami-0850e5601cc276af8   Windows_Server-2016-Japanese-Full-SQL_2017_Web-2020.03.11
ami-0ac24cd9cf87d3bbb   Windows_Server-2016-Japanese-Full-SQL_2017_Web-2020.04.15

Systems Managerパラメータストアを使って最新ビルドのAMIを取得する

特定のAMIについて最新ビルドの情報を取得する方法もあります。

完全なAMI名 (ビルド日付を除いた部分) が分かっている必要がありますが、常に最新のAMIを取得することができます。

AMI_NAME_ALIAS=Windows_Server-2019-Japanese-Full-Base
aws ssm get-parameters \
  --names /aws/service/ami-windows-latest/$AMI_NAME_ALIAS \
  --region ap-northeast-1
{
    "Parameters": [
        {
            "Name": "/aws/service/ami-windows-latest/Windows_Server-2019-Japanese-Full-Base",
            "Type": "String",
            "Value": "ami-092bd66a9b5bcf165",
            "Version": 21,
            "LastModifiedDate": 1587165514.066,
            "ARN": "arn:aws:ssm:ap-northeast-1::parameter/aws/service/ami-windows-latest/Windows_Server-2019-Japanese-Full-Base"
        }
    ],
    "InvalidParameters": []
}

パラメータストアを使った最新AMIの取得については、以下のブログ記事を参照してください。
よく使うOSの最新AMI IDを一撃で取得する | Developers.IO

おわりに

Linux AMIとは異なるWindows AMI特有の「AMI名」命名規則、AMIの種類のバリエーションについて、まとめてみました。

  • 初めて使う or あまり使わないAMIを探す時 → AMI名の命名規則の要素を条件にして検索
  • AMI名が分かっていて最新ビルドを取得したい時 → Systems Managerパラメータストアを使って取得

と使い分けるのが良いのではないかと思います。