curlライクにAWSのSigV4署名付きリクエストができるツール「awscurl」を紹介します

AWSを使っているとたまーに「AWS SigV4」署名付きリクエストでアクセスを許可するサービスがでてきます。そんなときにcurlライクにAWS SigV4署名付きリクエストができるツール「awscurl」を紹介します。
2022.05.18

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

みなさん。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署名をサクッと試したい時に便利なツールなので、ぜひ活用してみてください。