ISID X(クロス)イノベーション本部 の三浦です。
筆者の関わっている案件では、多数のAWSアカウント、ec2、ecsが存在しています。
で、大量のリソースがあるとSavings Plansの管理も大変であり、下記のようなツールを作成してSavings Plansの購入をしております(以後Savings PlansはSPと省略します)。
- フェデレーションでアカウントの認証情報一括取得(200アカウント弱)
- ec2一覧、ecs task一覧を作成(SP購入不要の場合は、タグによって除外)
- 各アカウントごとに必要なSP量を計算
- 現在購入済みSP料と比べ、SP不足分を算出
- 不足分のSPを購入
で、上記のような作業をエクセルベースでやっている方も多いかと思いますが、AWSのホームページから手動でSPの額をコピーするのは骨が折れる作業です。
なので、今回は、上記の情報に該当するデータをcsvとして取得する方法について記述します。
目次
スクリプト内容解説
下記、リンクはcloudshell 上で使うことを前提としたスクリプトです。
############ ステップ1:まずはこのコマンドをCloudShellで実行してください ############ pwsh ############ ステップ2:ここから下を全てコピーして実行してください ############ Import-Module AWSPowerShell.NetCore function Get-Ec2ComputeSavingsPlans { [CmdletBinding()] param( $region, $productDescription ) $fileter = @( @{Name = "tenancy"; Values = "shared"}, @{Name = "region"; Values = $region}, @{Name = "productDescription"; Values = $productDescription} ) $sp = Get-SPSavingsPlansOfferingRate -Product EC2 -SavingsPlanPaymentOption "All Upfront" -ServiceCode AmazonEC2 -SavingsPlanType Compute -region ap-northeast-1 -MaxResult 1000 -Filter $fileter $result = $sp | % { $xxx = "" | select Region, Rate,instanceType , productDescription , UsageType, UsageType_ARC_CPU_GB, OfferingId, PaymentOption, PlanDescription, PlanType, DurationSeconds, KEY $xxx.Region = $_.Properties | ? Name -eq region | % { $_.Value } $xxx.Rate = $_.Rate $xxx.UsageType = $_.UsageType $xxx.instanceType = ($_.Properties | ? Name -eq instanceType | % { $_.Value }) $xxx.productDescription = $productDescription $xxx.UsageType_ARC_CPU_GB = ($_.Properties | ? Name -eq productDescription | % { $_.Value })+"_"+ ($_.Properties | ? Name -eq instanceType | % { $_.Value }) $xxx.OfferingId = $_.SavingsPlanOffering.OfferingId $xxx.PaymentOption = $_.SavingsPlanOffering.PaymentOption.Value $xxx.PlanDescription = $_.SavingsPlanOffering.PlanDescription $xxx.PlanType = $_.SavingsPlanOffering.PlanType.Value $xxx.DurationSeconds = $_.SavingsPlanOffering.DurationSeconds $xxx.Key = $xxx.Region + "_" + $xxx.DurationSeconds + "_" + $xxx.UsageType_ARC_CPU_GB $xxx } return $result } $productList = @("Linux/UNIX","Windows","Red Hat Enterprise Linux") $resultList=@() $productList |%{ $p =$_ ## 一部の条件は決め打ち ## 全額前払い、共有テナンシー、 ## 対象は、Amazon EC2 の Compute Savings PlansのみでFargate の Compute Savings Planや ## インスタンスファミリー Savings Plan の料金は取得対象外 $l=Get-Ec2ComputeSavingsPlans -region ap-northeast-1 -productDescription $p $resultList += $l } $exportPath = "sp_list.csv" $resultList | Export-Csv -Path $exportPath -Encoding UTF8 -NoTypeInformation
なお、コアの部分は下記となります。各社、必要な条件に変えご利用ください(ISIDの場合、全額前払いでよいので割引率重視で全額前払い固定にしてます)。
#$productList = @("Linux/UNIX","Windows","Red Hat Enterprise Linux") $fileter = @( @{Name = "tenancy"; Values = "shared"}, @{Name = "region"; Values = $region}, @{Name = "productDescription"; Values = $productDescription} ) $sp = Get-SPSavingsPlansOfferingRate -Product EC2 -SavingsPlanPaymentOption "All Upfront" -ServiceCode AmazonEC2 -SavingsPlanType Compute -region ap-northeast-1 -MaxResult 1000 -Filter $fileter
下記に実行イメージを示します。
CloudShellの右上の「Actions > Dwonload file」から、下記のようなダイアログでファイルを取得できます。
コア部分は上ぐらいの非常にシンプルなコードです。productDescriptionはかなりの種別が存在しますので、上記以外のプロダクトタイプが必要な場合は追記してください。
その他SP運用に関するFAQ
Q1. 「Savings Plans > 推奨事項」 で簡易に必要SP量が見積もれるはずですが、なぜいちいち計算しているのですか?
A1. 上記の機能は、一括請求配下ですと他のアカウントのリザーブドインスタンス、SPの影響を受けてしまい正しい予測ができません。アカウント単位で必要なSP量を都度計算するようにしています。
Q2. 一括請求有効化、リザーブドインスタンス共有の場合、アカウント単位の正しいコストを把握するのは非常に難しい認識ですがどのように計算しているのですか?
A2. 専用の会計ツールを導入しております。リザーブドインスタンスを共有している場合、AWS純正の機能で正しいコストを判断するのは非常に難しいです。
まとめ
ということで、アカウントが多い場合、SP購入業務は結構大変な業務だと感じておりますが、自動化の一助になるかと思いSPの価格取得について記述しました。
なお、実業務としては↑全体をスクリプト化して運用しております。しかし、バグがあるとかなり大変なので、この業務の自動化を検討される方は入念なテストを強くお勧めします。
私たちは同じチームで働いてくれる仲間を探しています。クラウドアーキテクトの業務に興味がある方のご応募をお待ちしています。
クラウドアーキテクト
執筆:@miura.toshihiko、レビュー:寺山 輝 (@terayama.akira)
(Shodoで執筆されました)