ようへいの日々精進XP

よかろうもん

AWS Marketplace で使用量課金しているインスタンスの使用量追跡方法についてメモ

これは

qiita.com

初老丸 Advent Calendar 2017 4 日目の記事になる予定です.

tl;dr

aws.amazon.com

この仕組みを知らなくて、適当な権限を付与してインスタンスを起動したばっかりに大泣きすることになったのでメモ.

事件は AWS Marketplace で起こった

経緯

  • AWS Marketplace で提供されている, とある製品のインスタンスを AMI から起動した
  • その製品は転送量課金となっている
  • インスタンスには EC2 ReadonlyS3 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 アクション

  • 製品の使用量データを送信する APIMeterUsage)を呼ぶ為に必要な 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 生活を.