CData Software Blog

クラウド連携のCData Software の技術ブログです。

Postman の AWS Signature の使い方:STS AssumeRole

f:id:sugimomoto:20210513103758p:plain

こんにちは。CData Software Japan リードエンジニアの杉本です。

CData ではAWS サービス関係のDriver、例えばAWS Athena Driver やS3 Driver を作っていることもあり、APIを検証する時によくPostman で AWS Signature を使います。

www.cdata.com

www.cdata.com

ただ、よく使い方、リファレンスの確認場所などを忘れてしまうので、自分の備忘録的にやり方をまとめておきたいと思います。

AWS Signature について

AWS では各サービスのAPIリクエスト時にAPIリクエストのメソッド・クエリパラメータ・ヘッダーなどとAccessKey・SecretKeyを使って署名を行う必要があります。

docs.aws.amazon.com

この署名は最終的に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を行うための機能が提供されています。

learning.postman.com

使い方

今回は使うシチュエーションが多いであろうAWS Security Token Service(STS)のAssumeRoleを例として、実行方法を紹介したいと思います。

AssumeRoleのAPI仕様は以下のページで確認できます。

docs.aws.amazon.com

今回はシンプルに以下のような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」を入力しましょう。

f:id:sugimomoto:20210513102950p:plain

ちなみにこの「AWS Region」「Service Name」はAPIエンドポイントから基本的に特定できます。

以下のリファレンスを参照してみてください。

docs.aws.amazon.com

protocol://service-code.region-code.amazonaws.com

今回はAWS Regionに「us-east-1」、Service Nameに「sts」を入力するだけです。

入力後、APIリクエストのHeadersに「Authorization」と「X-Amz-Date」が自動的に挿入されます。

f:id:sugimomoto:20210513103003p:plain

これでリクエストを実行することで、以下のようなレスポンスを得ることができます。

<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>