読者です 読者をやめる 読者になる 読者になる

プログラマでありたい

おっさんになっても、プログラマでありつづけたい

Amazon Product Advertising APIが、IAMユーザーに対応していた

 Amazonの商品リンク等を生成するAmazon Product Advertising APIというサービスがあります。これは、今でいうAWS(Amazon Web Services)が出てる前は、Amazon Web Serviceという名前でした。このサービスはAWSが出る前から存在するということで、IAMユーザーを利用して最小限の権限を付与して利用するという事が出来ませんでした。何とルートアカウントのアクセスキーとシークレットアクセスキーを利用して、APIを操作するという男前仕様です。と言っても、広告のAPIを操作するだけなので、基本的には問題は少なかったです。

 そんな中で、AWSが出てきてAmazon Product Advertising APIのアカウントがAmazon Web Servicesに統合されたことにより問題が顕在化してきました。AWSはIAMが出てきて、ルートアカウントの利用が非推奨なのに、Product Advertising APIの方は依然としてルートアカウントでしか利用できないという問題です。ずっと何とかならんのかなぁと思っていたのですが、いつの間にか改善されているのを発見しました。

IAMユーザーで、Amazon Product Advertising APIを利用する


Becoming a Product Advertising API Developerを見ていると、下記の通りProductAdvertisingAPIの権限を付与することでAmazon Product Advertising APIが利用できるとあります。注意点としては、AWSのコンソールから、IAMのPolicy Generatorを見ても、ProductAdvertisingAPIの権限は出てきません。カスタムポリシーで作る必要があります。Product Advertising APIのIAM対応について幾つかのブログで紹介されていましたが、どれもAdministrator権限を付与しろとありました。それだと、限りなく意味がないので止めましょう。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ProductAdvertisingAPI:*",
            "Resource": "*"
        }
    ]
}


docs.aws.amazon.com

 さて、いつからIAMユーザに対応したのでしょうか?Internet Archiveを見る限り、2016年末のアーカイブでは対応していなかった模様なので、2017年からの対応のようです。AWSのニュースを見ていても、特にアナウンスは無かったとは思います。扱いが小さいですね。

Node.jsでProduct Advertising APIを呼び出すサンプル



 それでは、このIAMユーザを利用した実際に呼び出せるのか試してみましょう。Node.jsでは、apacというProduct Advertising APIを呼び出すクライアントライブラリがあります。簡単なので、これで試してみましょう。サンプルの部分に、作成したIAMユーザのKeyを埋め込めばそのまま使えます。ただキーをコードに埋め込むのは危険なので、環境変数等を利用しましょう。

const {OperationHelper} = require('apac');

const opHelper = new OperationHelper({
    endPoint:   'webservices.amazon.co.jp',
    awsId:     process.env.AFFILIATE_KEY,
    awsSecret: process.env.AFFILIATE_SECRET,
    assocId:   'your associate id'
});

opHelper.execute('ItemSearch', {
  'SearchIndex': 'Books',
  'Keywords': 'harry potter',
  'ResponseGroup': 'ItemAttributes,Offers'
}).then((response) => {
    console.log("Results object: ", response.result);
    console.log("Raw response body: ", response.responseBody);
}).catch((err) => {
    console.error("Something went wrong! ", err);
});

 ちなみに、このProduct Advertising APIは利用制限が厳しく、デフォルトでは1秒に1回に制限されています。APIで作成したリンクからの売上が上がると、レートが緩和されるという仕様です。
Changes to request limits - Product Advertising API

 レートを超えると下記のようにエラーが出るのでご注意を

Results object:  { ItemSearchErrorResponse: 
   { '$': { xmlns: 'http://ecs.amazonaws.com/doc/2013-08-01/' },
     Error: 
      { Code: 'RequestThrottled',
        Message: 'AWS Access Key ID: AKIXXXXXXXXXXXXXXXXX. You are submitting requests too quickly. Please retry your requests at a slower rate.' },
     RequestId: 'f07ba5e6-e458-40ee-a693-6a2295cf8550' } }
Raw response body:  
<?xml version="1.0"?>
<ItemSearchErrorResponse xmlns="http://ecs.amazonaws.com/doc/2013-08-01/">
  <Error>
    <Code>RequestThrottled</Code>
    <Message>AWS Access Key ID: AKIXXXXXXXXXXXXXXXXX. You are submitting requests too quickly. Please retry your requests at a slower rate.</Message>
  </Error>
  <RequestId>f07ba5e6-e458-40ee-a693-6a2295cf8550</RequestId>
</ItemSearchErrorResponse>

感想



 やっとまっとうになったのだから、もう少し周知した方が良いのではないでしょうか?誰にも知られずヒッソリとなので、Admin権限を与えよといった間違った情報が出回るようになるのです。