こんにちは。CData Software Japan リードエンジニアの杉本です。
CData ではAWS サービス関係のDriver、例えばAWS Athena Driver やS3 Driver を作っていることもあり、APIを検証する時によくPostman で AWS Signature を使います。
ただ、よく使い方、リファレンスの確認場所などを忘れてしまうので、自分の備忘録的にやり方をまとめておきたいと思います。
AWS Signature について
AWS では各サービスのAPIリクエスト時にAPIリクエストのメソッド・クエリパラメータ・ヘッダーなどとAccessKey・SecretKeyを使って署名を行う必要があります。
この署名は最終的にAuthorization Headerに追加され、認証情報として利用されます。
例えばSTSサービスへのリクエストを例に上げると、以下のようになっていて、「Authorization: AWS4-HMAC-SHA256」の部分がこの署名プロセスで生成された値です。
GET /?Action=AssumeRole&DurationSeconds=3600&RoleArn=XXXXX&RoleSessionName=XXXXX&Version=2011-06-15 HTTP/1.1 Host: sts.us-east-1.amazonaws.com X-Amz-Date: 20210513T002630Z Authorization: AWS4-HMAC-SHA256 Credential=XXXXXX/20210513/us-east-1/sts/aws4_request, SignedHeaders=host;x-amz-date, Signature=XXXXXX
詳しい署名の手順はリファレンスに掲載されているので、そのとおりに実施すれば作成できますが、ちょっとAPIを検証したい時とかは面倒ですよね。
でも、なんとAPI開発・検証ツールのPostman では標準機能でこのAWS Signatureを行うための機能が提供されています。
使い方
今回は使うシチュエーションが多いであろうAWS Security Token Service(STS)のAssumeRoleを例として、実行方法を紹介したいと思います。
AssumeRoleのAPI仕様は以下のページで確認できます。
GET https://sts.us-east-1.amazonaws.com/?Action=AssumeRole&DurationSeconds=3600&RoleArn=arn:aws:iam::XXXXX:role/XXXX&RoleSessionName=XXXXX&Version=2011-06-15
設定方法は簡単でPostmanでAPIリクエストを作成した後、「Authorization」タブで「AWS Signatrue」を選択し、必要情報を入力するだけです。
AssumeRoleの実行権限があるIAMユーザーの「AccessKey」・「SecretKey」と「AWS Region」「Service Name」を入力しましょう。
ちなみにこの「AWS Region」「Service Name」はAPIエンドポイントから基本的に特定できます。
以下のリファレンスを参照してみてください。
protocol://service-code.region-code.amazonaws.com
今回はAWS Regionに「us-east-1」、Service Nameに「sts」を入力するだけです。
入力後、APIリクエストのHeadersに「Authorization」と「X-Amz-Date」が自動的に挿入されます。
これでリクエストを実行することで、以下のようなレスポンスを得ることができます。
<AssumeRoleResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/"> <AssumeRoleResult> <AssumedRoleUser> <AssumedRoleId>XXXXXX:XXXXXXX</AssumedRoleId> <Arn>arn:aws:sts::XXXXX:assumed-role/XXXXXX/XXXXX</Arn> </AssumedRoleUser> <Credentials> <AccessKeyId>XXXXXXX</AccessKeyId> <SecretAccessKey>XXXXXX</SecretAccessKey> <SessionToken>XXXXXXX</SessionToken> <Expiration>2021-05-13T01:49:13Z</Expiration> </Credentials> </AssumeRoleResult> <ResponseMetadata> <RequestId>XXXX</RequestId> </ResponseMetadata> </AssumeRoleResponse>