DoiT Console、Amazon Price API、AIアシスタントAmazon Qを組み合わせ、移行先リージョンにおけるAWSクラウドインフラのコスト試算を効率化する方法

インフラ構成の見直しを検討する際、AWSリージョン間のコスト差を把握しておくことは欠かせません。ユースケース次第で、どのリージョンがコスト面で有利かが変わってくるためです。たとえば、ディザスタリカバリ用のリージョンを選定するとき、ビジネス展開先のリージョンを検討するとき、あるいは既存インフラの移行先を決めるときなどに役立ちます。
本記事では、私自身がAWSインフラをバージニア(us-east-1)からヨーロッパの2つのリージョン、フランクフルト(eu-central-1)とアイルランド(eu-west-1)へ移行する際のコストをどのように試算したかをご紹介します。分析に用いたのは、DoiT Console、Amazon Q、AWS Price APIの3つの主要ツールです。
DoiT Consoleでバージニアの現在の使用量を取得する
DoiT Consoleは、DoiTの製品群をブラウザから操作できるWebアプリケーションです。クラウド請求情報を詳細かつ柔軟に可視化できるレポート機能を備えています。
まず最初に行ったのは、コスト試算のインプットとなるバージニアの現行クラウド使用量データを、DoiTのレポートで取得することです。ここで利用したのはDoiT Consoleの「Services Breakdown」レポートで、以下のようにカスタマイズしました:
• 表示形式をテーブルビューに切り替える
• メトリクスをコストから使用量(usage)に変更する
• 期間を月次に設定する
• Account、Service、SKU、SKU ID、Unitでグループ化する
設定内容は以下の画像のとおりです:

DoiT定義済みレポート Service Breakdownのカスタマイズ
続いてこのレポートをダウンロードし、出力されたCSVファイルを試算のインプットとして使用しました:

DoiTレポートのエクスポート
別リージョンのコスト試算ツールとしてのAWS Price API
レポートには、現在バージニアにデプロイされているすべてのサービスの使用量、SKU ID、価格が並びます。このデータをもとに、フランクフルトとアイルランドにおける同等のSKU IDと価格を割り出せば、各リージョンの推定コストを算出できます。
AWS Price APIは、AWS全サービスの価格情報を提供するAPIです。指定した属性で製品を検索できるGetProducts関数も用意されています。DoiTレポートからSKU IDが手元にあるので、それを起点に詳細な製品情報を取得できます。AWS CLIから以下のコマンドで属性を取得できます:
aws pricing get-products \
--service-code AmazonEC2 \
--region us-east-1 \
--filters Type=TERM_MATCH,Field=sku,Value="6C86BEPQVG73ZGGR"
{
"PriceList": [\
{\
"product": {\
"productFamily": "Compute Instance",\
"attributes": {\
"enhancedNetworkingSupported": "Ye\
"intelTurboAvailable": "Yes",\
"memory": "8 GiB",\
…\
"locationType": "AWS Region",\
"storage": "EBS only",\
"instanceFamily": "General purpose\
"operatingSystem": "Linux",\
"intelAvx2Available": "Yes",\
…\
"processorFeatures": "Intel AVX; I\
"servicecode": "AmazonEC2",\
"licenseModel": "No License required"\
"currentGeneration": "Yes",\
…\
"processorArchitecture": "64-bit",\
"marketoption": "OnDemand",\
},\
"sku": "6C86BEPQVG73ZGGR"\
},\
"serviceCode": "AmazonEC2",\
"terms": {\
"OnDemand": {\
"6C86BEPQVG73ZGGR.JRTCKXETXF": {\
"priceDimensions": {\
"6C86BEPQVG73ZGGR.JRTCKXET\
"unit": "Hrs",\
"endRange": "Inf",\
"description": "$0.096\
"appliesTo": [],\
"rateCode": "6C86BEPQV\
"beginRange": "0",\
"pricePerUnit": {\
"USD": "0.09600000\
}\
}\
},\
"sku": "6C86BEPQVG73ZGGR",\
"effectiveDate": "2025-07-01T0\
"offerTermCode": "JRTCKXETXF",\
"termAttributes": {}\
}\
},\
"Reserved": {\
…\
```\
次に、これらの属性を使って以下のコマンドを実行すれば、移行先リージョンの該当製品とそのSKU、価格を特定できます:\
```\
aws pricing get-products --service-code AmazonEC2 --region eu-central-1 \\
--filters 'Type=TERM_MATCH,Field="instanceType",Value="m5.large"' \\
'Type=TERM_MATCH,Field=productFamily,Value="Compute Instance"' \\
'Type=TERM_MATCH,Field="instanceFamily",Value="General purpose"' \\
'Type=TERM_MATCH,Field="operatingSystem",Value="Linux"' \\
'Type=TERM_MATCH,Field="licenseModel",Value="No License required"' \\
'Type=TERM_MATCH,Field="locationType",Value="AWS Region"'\
```\
結果として、対応する製品が次のように返されます:\
```\
{\
"product": {\
"productFamily": "Compute Instance",\
"attributes": {\
"enhancedNetworkingSupported": "Yes",\
…\
"gpuMemory": "NA",\
"vpcnetworkingsupport": "true",\
"instanceType": "m5.large",\
…\
"availabilityzone": "NA"\
},\
"sku": "223J7SG3VCFCDM9M"\
},\
"serviceCode": "AmazonEC2",\
"terms": {\
"OnDemand": {\
"223J7SG3VCFCDM9M.JRTCKXETXF": {\
"priceDimensions": {\
"223J7SG3VCFCDM9M.JRTCKXETXF.6YS6EN2CT7": {\
"unit": "Hrs",\
"endRange": "Inf",\
"description": "$0.112 per Unused Reservation Linux m5.large Instance Hour",\
"appliesTo": [],\
"rateCode": "223J7SG3VCFCDM9M.JRTCKXETXF.6YS6EN2CT7",\
"beginRange": "0",\
"pricePerUnit": {\
"USD": "0.1120000000"\
}\
}\
},\
"sku": "223J7SG3VCFCDM9M",\
"effectiveDate": "2025-07-01T00:00:00Z",\
"offerTermCode": "JRTCKXETXF",\
"termAttributes": {}\
}\
}\
},\
"version": "20250715014947",\
"publicationDate": "2025-07-15T01:49:47Z"\
```\
**Amazon Qで移行先リージョンの同等SKUを探すスクリプトを生成する**\
CSVファイルを処理し、現行リージョンの各SKUを順に検索したうえで、移行先リージョンで一致するSKUを探すスクリプトをゼロから書こうとすると、かなりの手間がかかります。そこで頼りになったのが、AWSのAIアシスタントであるAmazon Qです。これらの作業を大幅に効率化してくれました。\
このライターからの最新情報を受け取るには、Mediumに無料登録しましょう。\
Subscribe\
Subscribe\
このデバイスを記憶してサインインを高速化する\
まず、[こちら](https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/command-line-installing.html)の手順に沿ってAmazon Q CLIをインストールしました。次に新しいプロジェクトフォルダを作成し、DoiTレポートのCSVファイルをそこに配置。そのフォルダでAmazon Qチャットを開き、実現したい内容を指示しました。指示の内容はおおむね次のとおりです:\
\
Amazon Qを使って移行先リージョンのコスト試算を生成する\
```\
以下を行うPythonスクリプトを作成したい:\
- costbyskuvirginia.csvのような、AWSリージョン Virginia における各種AWSサービスの現在の使用量を含むファイルを入力として受け取る。\
- AWS price APIを使い、ソースリージョンの現在のSKUを見つけ、その属性を使ってターゲットリージョンの対応するSKUを見つける。\
- 出力は、入力ファイルのコピーに加え、フランクフルトリージョンの価格を含む同じ情報を追加したものとする。\
```\
この指示で、Amazon Qは上々のスタートを切ってくれました:\
- CSVファイルを読み込み・処理するロジックを作成。\
- 入力ファイル内のAWSサービス名から、AWS price APIで必要となるAWSサービスコードへのマッピングを作成。\
- ソースリージョンのSKUを問い合わせるロジックを作成。\
- フランクフルトでSKUを検索する初期ロジックを作成。\
- フランクフルト用の同じフィールドを持つ新しいファイルを生成し、追加フィールドも付与。\
初期のcostbyskuvirginia.csvファイルにおける主要なフィールドは以下のとおりです:\
\
SKU別Virginiaコスト使用量のCSVファイル\
Amazon Qが生成したPythonスクリプトの出力は、次のような内容でした:\
\
初期の計算結果は一部の行については正しかったものの、他の行ではいくつかの問題が見つかりました。完全に一致するSKUを特定するのではなく、ツールがコストを推定で算出しているケースもありました。さらに、想定される価格パターンと整合しないコスト差も見受けられました。説明文を確認したところ、ミスマッチが判明しました。たとえば、「Amazon EKS cluster usage in US East (N. Virginia)」($0.08928/時間)のSKUを「EKS Auto Mode management of i3.2xlarge in EU (Frankfurt)」と紐付けていたのです。\
この不整合を解消するようAmazon Qに指示してみましたが、本質的な問題には届かないアプローチを繰り返すばかりでした。そこで方針を切り替え、まずは手作業で問題を調査することにしました。これにより、Amazon Qに対して的確な指示を出せるようになりました。\
手作業での調査の結果、SpotインスタンスなどのSKUはAWS price APIに含まれていないことが分かりました。これらは試算対象から除外しています。\
次に、価格とリージョンを除いて説明文(description)が異なる行を抽出するようAmazon Qに依頼しました。このタスクに対してAmazon QはPythonスクリプトを作成し、差分を一覧化してくれました。\
抽出された差分を手作業で確認したところ、移行先リージョンで正しいSKUを取得するには、一部の製品についてアルゴリズムに追加の属性を渡す必要があることが分かりました。たとえば、product family「Compute Instance」の属性にlicenseModelが含まれておらず、その結果、LinuxインスタンスではなくWindowsインスタンスのSKUが選ばれてしまっていました。\
また、同じSKU IDに複数の価格が存在する製品もありました。この場合、アルゴリズムは移行先リージョンで正しいSKUを見つけられたものの、価格リストの先頭の値を採用してしまっていました。これでは使用量に応じて単価が変動する段階的価格設定(ティアプライシング)が反映されません。\
この問題の解決にもAmazon Qを活用しました。詳細な指示を与えたところ、使用量に応じて適切な価格帯を選択するロジックを組んでくれました。これらの修正を経て、アルゴリズムは140製品中108製品でコストを正しく試算できるようになり、今回の分析には十分な精度に達しました。\
フランクフルトの計算が安定したところで、Amazon Qにアイルランドもスクリプトに追加するよう依頼しました。Amazon Qはアイルランドの試算ロジックを正しく加え、出力ファイルもそれに合わせて更新してくれました。\
Amazon Qの支援で生成した初期コードは、こちらのパブリックGitHub[リポジトリ](https://github.com/dianibar/estimate-aws-region-cost)で公開しています。\
本プロジェクトの今後の展開は次のとおりです:\
- アルゴリズムを汎用化し、任意のソースリージョンの入力ファイルから、任意の移行先リージョンの試算を生成できるようにする。\
- 試算で新しいサービスが要求された際にそれを認識し、必要なフィルタを組み込めるようアルゴリズムを更新する。\
- AWSが先日発表した[AWS Pricing MCP Server](https://aws.amazon.com/blogs/aws-cloud-financial-management/aws-price-list-gets-a-natural-language-upgrade-introducing-the-aws-pricing-mcp-server/)機能の活用を検討する。\
- コードの品質を高める。\
リージョン間でAWSクラウドインフラのコストを比較・試算することは、的確な意思決定を下すうえで欠かせません。**DoiT Consoleは、ソースリージョンの現行使用データという土台となる情報を提供し、重要な役割を果たします**。この詳細なインプットを、リージョン別価格を取得するAWS Price APIや自動化を担うAmazon Qと組み合わせることで、信頼性の高いコスト試算が実現します。\