- これは
- tl;dr
- 事件は AWS Marketplace で起こった
— 経緯
— 初動
— 原因
— 対処 - MeterUsage API
— 概要
— aws-marketplace:MeterUsage アクション
— MeterUsage for AWS SDK for Ruby - ということで
これは
qiita.com
初老丸 Advent Calendar 2017 4 日目の記事になる予定です.
tl;dr
aws.amazon.com
この仕組みを知らなくて、適当な権限を付与してインスタンスを起動したばっかりに大泣きすることになったのでメモ.
事件は AWS Marketplace で起こった
経緯
- AWS Marketplace で提供されている, とある製品のインスタンスを AMI から起動した
- その製品は転送量課金となっている
- インスタンスには
EC2 Readonly
とS3 FullAccess
のポリシーを付与した Instance Profile をアタッチしていた - インスタンス起動直後は普通に動いていたが、ある日突然、製品のログイン画面にライセンスエラーが出てしまった
初動
- 全く原因が解らず…
- インスタンスにログインして製品が展開されているディレクトリを彷徨っていると、以下のようなログが記録されたファイルを発見
{ "aggregation_base": "0 B", "last_aggregate_usage": "0 B", "last_error": "com.amazonaws.AmazonServiceException: User: arn:aws:sts::123456789012:assumed-role/your-instan-profile/i-xxxxxxxxxxxxx is not authorized to perform: aws-marketplace:MeterUsage (Service: AWSMarketplaceMetering; Status Code: 400; Error Code: AccessDeniedException; Request ID: xxxxxxxx-xxxx-xxxx-xxxx-)", ... 略 "usage": { "pending": "0 B", "reported": "0 B" } }
ほう。
原因
先述のログに記録されている通り, aws-marketplace:MeterUsage
というポリシーが付与されていなかった為、転送量のレポートが送信出来ていなかった為にライセンスが未認証な状態になってしまった(と考えている).
対処
以下のようなポリシーを付与して, 改めてインスタンスを再作成したところ, ライセンスエラーは解消され、先述のエラーも出力されなくなった.
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "aws-marketplace:MeterUsage" ], "Effect": "Allow", "Resource": "*" } ] }
MeterUsage API
概要
- http://docs.aws.amazon.com/marketplacemetering/latest/APIReference/API_MeterUsage.html
- 使用量(転送量だったり管理ホスト数だったり)データは製品の使用の有無にかかわらず、1 時間に 1 回送信する必要がある
- 製品が正常動作していることを確認するために, 測定レコードが 1 時間に 1 回生成されることを要求する
- 製品からのレコード送信が停止すると, AWS では顧客に E メールを送信してネットワーク設定の調整を求める
aws-marketplace:MeterUsage アクション
- 製品の使用量データを送信する API(
MeterUsage
)を呼ぶ為に必要な IAM ポリシーアクション
以下のポリシーを製品に付与する必要がある.
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "aws-marketplace:MeterUsage" ], "Effect": "Allow", "Resource": "*" } ] }
MeterUsage for AWS SDK for Ruby
例えば、AWS SDK for Ruby だと以下のように書くはず.
require 'aws-sdk' client = Aws::MarketplaceMetering::Client.new() resp = client.meter_usage({ product_code: "ProductCode", timestamp: Time.now, usage_dimension: "UsageDimension", usage_quantity: 1 dry_run: false })
#meter_usage
メソッドの主なオプションは以下の通り.
オプション 名 | 用途 |
---|---|
product_code | AWS Marketplace 製品コード |
timestamp | ISO-8601 フォーマットのタイムスタンプ (UTC) |
usage_dimension | 使用量のディメンション |
usage_quantity | 使用量 |
ドキュメントを見ていたら #batch_meter_usage
というメソッドも用意されていて, バッチ処理で複数の customer_identifier
を送信可能なようだ.(用途不明)
ということで
AWS Marketplace の製品を利用する際はよーくドキュメントを読んで, aws-marketplace:MeterUsage
アクションを許可する必要がないかを確認しましょう.
それでは、良い AWS Marketplace 生活を.