Postman から AWS API 経由で EC2インスタンスの一覧を取得する

f:id:sugimomoto:20200426223606p:plain

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

CData では現在200種類ほどのデータソースに対応していることもあり、AWS・GCP・Azure それぞれで検証環境を構築できるように社内のサブスクリプションが複数存在します。

そんな時、ちょっと困ってしまうのがインスタンスの立ち上げっぱなしで予期しない課金が発生してしまうことです。

もちろん、Cost Management系のサービスを利用して閾値に達した時に通知を飛ばすようにもしているのですが、じわじわとした予期せぬ立ち上げっぱなしを防ぐのには向きません。

そこで毎日立ち上げっぱなしのEC2インスタンスが無いかどうかをチャットツールに通知する仕組みを作りたいなと思い、AWS APIを調べてみました。

この記事では Postman で AWS API を利用し、EC2のインスタンス一覧を取得するところまで紹介したいと思います。

対象のAPI

今回は前述の通り、よく利用するEC2インスタンスを対象とします。

ちなみに AWS SDK・CLIを利用することもできますし、ソッチのほうが手軽だと思いますが、API中毒の人間としてはAPI直を確かめないわけにはいかないので、この手法を取ります。(最終的にSDKを使うつもりですが、単純に興味があるだけです)

EC2のAPI Referenceは以下のURLで確認できます。

Amazon Elastic Compute Cloud API Reference https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/APIReference/Welcome.html

API のリクエスト構文

AWS API はHTTPベースでリクエストを行い、XMLのレスポンスを受け取ります。

ポイントとなるの以下のリファレンスに記載されている5点です。

docs.aws.amazon.com

・Endpoint: The URL that serves as the entry point for the web service.

・Action: The action that you want to perform; for example, use RunInstances to launch an instance.

・Parameters: Any parameters for the action; each parameter is separated by an ampersand (&).

・Version: The API version to use.

・Authorization parameters: The authorization parameters that AWS uses to ensure the validity and authenticity of the request. Amazon EC2 supports Signature Version 2 and Signature Version 4; for more information, see Signature Version 2 Signing Process and Signature Version 4 Signing Process in the Amazon Web Services General Reference.

最終的なリクエストは以下のHTTP構文になりました。

GET /?Action=DescribeInstances&Version=2016-11-15&Filter.Name=instance-state-name&Filter.Value=running HTTP/1.1
Host: ec2.ap-northeast-1.amazonaws.com
X-Amz-Date: 20200426T131808Z
Authorization: AWS4-HMAC-SHA256 Credential={{Access Key}}/20200426/ap-northeast-1/ec2/aws4_request, SignedHeaders=host;x-amz-date, Signature={{生成したSignature}}

エンドポイントは「https://ec2.amazonaws.com/」をベースにリージョンを指定します。今回は「https://ec2.ap-northeast-1.amazonaws.com/」を使います。

AWS API はREST FulなAPIではなく、クエリパラメータで実行したい「Action」を指定する方式でリクエストします。SOAPとはまた違いますが、RPC的なノリですね。

SDKやCLIなどを使っているとよくわかると思います。

今回はEC2インスタンス一覧を取得できる「DescribeImages」をアクションとして指定しました。

docs.aws.amazon.com

そこにフィルター構文などのパラメータが加わります。今回は実行されているEC2インスタンスを取得したいのでフィルター構文で「Filter.Name=instance-state-name&Filter.Value=running」を指定しました。このあたりの指定方法が少し特殊ですね。

認証方法はAuthorization HeaderでSignature Version 4で生成した署名を指定します。以下のリファレンスに生成方法の詳細が記載されていますが、今回は後述するPostmanを使った方法で手軽に対処できます。

docs.aws.amazon.com

Postman でリクエストしてみる

それでは Postman を使って、APIを叩いてみましょう。

まず、GETリクエストで上記URLを指定します。URLでregionを指定するのを忘れないでください。また、Verisonとして「2016-11-15」を指定しています。

f:id:sugimomoto:20200426223350p:plain

次に Authorization です。通常であれば、HMAC-SHA256で署名しなければいけませんが、大変うれしいことにPostmanではデフォルトでAWS API用の認証方法をサポートしています。

https://learning.postman.com/docs/postman/sending-api-requests/authorization/#aws-signature

「Authorization」タブに移動し「AWS Signature」を選ぶことで、以下のようにAWSのAccessKey・SecretKeyなどを入力する画面が表示されます。ここにそれぞれAccessKey・SecretKeyおよびRegionと対象となるサービスである「ec2」を指定すればOKです。

f:id:sugimomoto:20200426223401p:plain

これでリクエストを実行すると、以下のように起動中のマシン一覧が取得できます。

f:id:sugimomoto:20200426223408p:plain

おわりに

AWS Signatureの方法を知っていると、かなり手軽にリクエストできますね! 素晴らしい。

SDKやCLIを使っているとあまり意識しない部分ですが、これで任意の言語からも実行できると思います。(Signatureの生成がちと面倒ですが)

外のActionも基本的にはこの方法がベースなので、参考にしてみてください。

参考

blog.scottlowe.org

docs.aws.amazon.com

トライアル・お問い合わせ

関連コンテンツ