curlライクにAWSのSigV4署名付きリクエストができるツール「awscurl」を紹介します
みなさん。AWS使ってますか?
AWSを使っているとたまーに「AWS SigV4」署名付きリクエストでアクセスを許可するサービスがでてきます。
代表的な例をあげると IAM認可 を設定した API Gateway です。
このAWS SigV4署名はAWSの アクセスキーID と シークレットアクセスキー を元に署名を行い、ドキュメントに署名手順の例も載っているんですが、自分でやるには手順が複雑で面倒くさいです。
そんなときにはこのツール、「 awscurl 」が便利です。
curl と同じような使用感でAWSのSigV4署名付きリクエストができます。
インストール
インストールはpythonが入っていれば簡単です。pipを使って以下のコマンドでインストールできます。
$ pip install awscurl
使用例1:IAM認可を設定したAPI Gateway(REST API)
API Gateway(REST API)にIAM認可を設定した場合、HTTPSへのリクエストにAWS SigV4署名をつけなければアクセスできないように制限をかけられます。
IAM認可の設定は、API Gatewayのメソッドリクエストからできます。
認可の設定から AWS_IAM を選択して右の 更新(レ点) ボタンを押して設定します。
これで設定は完了です。
設定が終わったらステージにデプロイすることで設定したAPIを実行することができます。
URLはステージから確認することができます。
実際にcurlでアクセスしてみると、IAM認可の設定が入っているのでアクセス制限がかかっており、このままではアクセスできません。
$ APIGATEWAY_URL=<<API GatewayのURLをコピー&ペースト>> $ curl $APIGATEWAY_URL/pets {"message":"Missing Authentication Token"}
awscurlを使うとAWS SigV4署名をつけたリクエストを送ってアクセスできます。 必要なパラメーターは AWSのプロファイル名(または、アクセスキーIDとシークレットアクセスキー) と サービス名 と リージョン です。 サービス名は省略するとデフォルトが execute-api なので、省略することもできます。
$ export AWS_DEFAULT_PROFILE=<<使用するAWSのプロファイル名>> $ awscurl \ --service execute-api \ --region us-west-2 \ $APIGATEWAY_URL/pets [ { "id": 1, "type": "dog", "price": 249.99 }, { "id": 2, "type": "cat", "price": 124.99 }, { "id": 3, "type": "fish", "price": 0.99 } ]
使用例2:IAM認可を設定したAPI Gateway(HTTP API)
API Gateway(HTTP API)にIAM認可を設定した場合も同様に、HTTPSへのリクエストにAWS SigV4署名をつけなければアクセスできないように制限をかけられます。
IAM認可の設定は、API Gatewayの認可の部分から、オーサライザーをアタッチして設定できます。
これで設定は完了です。
URLはステージから確認することができます。
実際にcurlでアクセスしてみると、IAM認可の設定が入っているのでアクセス制限がかかっており、このままではアクセスできません。
$ APIGATEWAY_URL=<<API GatewayのURLをコピー&ペースト>> $ curl $APIGATEWAY_URL/hello {"message":"Forbidden"}
awscurlを使うとREST APIと同様にAWS SigV4署名をつけたリクエストを送ってアクセスできます。
$ export AWS_DEFAULT_PROFILE=<<使用するAWSのプロファイル名>> $ awscurl \ --service execute-api \ --region ap-northeast-1 \ $APIGATEWAY_URL/hello {"message": "Hello, World!!"}
使用例3:IAM認証を設定したAppSync
AppSyncにIAM認証を設定した場合、HTTPSへのリクエストにAWS SigV4署名をつけなければアクセスできないように制限をかけられます。
IAM認証の設定は、AppSyncの設定のデフォルトの認証モードからできます。
デフォルトの認証モードを IAM に変更したら、ページ下部の保存ボタンを押すことで設定が反映されます。
AppSyncのAPI URLは設定から確認することができます。
GrpahQLとしてアクセスできるように以下のスキーマを定義しておき、getDemosのResolverにはDynamDBを定義しておきます。
type Query { getDemos: [demo!] } type demo { id: String! version: String! }
実際にgetDemosのクエリを実行しようとcurlでアクセスしてみると、IAM認証の設定が入っていてアクセス制限がかかっており、このままではアクセスできません。
$ APPSYNC_URL=<<AppSyncのURLをコピー&ペースト>> $ curl -X POST \ -H 'Content-Type: application/json' \ -d '{ "query": "query {getDemos{ id version } } " }' \ $APPSYNC_URL { "errors" : [ { "errorType" : "UnauthorizedException", "message" : "You are not authorized to make this call." } ] }
awscurlを使うとAppSyncに対しても、AWS SigV4署名をつけたリクエストを送ってアクセスできます。
$ export AWS_DEFAULT_PROFILE=<<使用するAWSのプロファイル名>> $ awscurl -X POST \ --service appsync \ --region us-west-2 \ -H 'Content-Type: application/json' \ -d '{ "query": "query {getDemos{ id version } } " }' \ $APPSYNC_URL {"data":{"getDemos":[{"id":"4fa631d3-5f70-464e-adb9-c3bdca909f38","version":"test"}]}}
使用例4:IAM認証を設定したLambda Function URLs
LambdaにはHTTPSエンドポイントを追加してWebフックみたいな使い方ができる、Lambda Function URLsという機能があります。
最近追加された機能で、詳しくは次のブログを御覧ください。
Lambda Function URLsにIAM認証を設定した場合、HTTPSエンドポイントへのリクエストにAWS SigV4署名をつけなければアクセスできないように制限をかけられます。
IAM認証の設定は、Lambdaの関数URLの設定画面の認証タイプからできます。
Lambda Function URLsのエンドポイントURLは関数URLの画面から確認することができます。
実際にcurlでアクセスしてみると、IAM認証の設定が入っているのでアクセス制限がかかっており、このままではアクセスできません。
$ FUNCTION_URL=<<Lambda Function URLsのURLをコピー&ペースト>> $ curl ${FUNCTION_URL} {"Message":"Forbidden"}
awscurlを使うとLambda Function URLsに対しても、AWS SigV4署名をつけたリクエストを送ってアクセスできます。
$ export AWS_DEFAULT_PROFILE=<<使用するAWSのプロファイル名>> $ awscurl \ --service lambda \ --region us-west-2 \ ${FUNCTION_URL} {"message":"Hello, Lambda!!"}
使用例5:AWS APIの実行
AWSは基本的にWeb APIを使ってAWSリソースを操作できます。
AWSリソースを操作する方法として、マネジメントコンソールやAWS CLI、AWS SDKと様々な方法が用意されています。 これらはAWS APIをラップして操作しやすいような形で提供されています。
そのため、わざわざAWS APIを直接使用する必要はあまり無いのですが、AWSのWeb APIをSDK等無しで直接実行することも可能です。
そのAWS APIの実行の際に有効なアクセスキー(AWSアクセスキーID、AWSシークレットアクセスキー)を持っていることを確認するため、リクエストにAWS SigV4署名をつける必要があります。 詳しくはこちらのドキュメントを御覧ください。
例えば、S3の全バケットのリストを取得したい場合は、 ListBuckets のAPIを実行することで取得できます。
具体的なコマンドをあげると、awscurlを使ってAWS SigV4署名をつけたリクエストを送ってアクセスすると、S3の全バケットリストが取得できます。
$ export AWS_DEFAULT_PROFILE=<<使用するAWSのプロファイル名>> $ awscurl \ --service s3 \ --region us-east-1 \ "https://s3.amazonaws.com/"
終わりに
本ブログで awscurl のツールを紹介しました。
どういった場面でAWS SigV4署名が必要なのか具体例を上げることで、利用イメージが湧きやすくなったと思います。 AWS SigV4署名をサクッと試したい時に便利なツールなので、ぜひ活用してみてください。