佐藤のメモ帳

Rust, Python, Java, AWS, etc...

cURLでAPI GatewayにGETリクエストを投げるためにはXオプション指定が必要

結論

cURLAPI GatewayにGETリクエストを投げる場合、Xオプションで使用メソッドを明示的に指定する必要がある。
何故オプションを省略するとエラーになるかは不明。

背景

API Gatewayを試そうと、cURLでリクエストを投げたら失敗した。
意外な原因だったため記録する。

環境

詳細

API Gatewayに設定したリソースにGETリクエストをcURLで投げたところ、HTTPステータスコード403が返され、エラーになった。
APIキーの生成、使用量プランの設定(対象のステージとAPIキーの紐付け)、curlコマンドに設定されているAPIキーが正しいか、パスが正しいかなど調べたが特に誤っているものはなかった。

投げたコマンドは以下

satoukensuke@MacBook-Pro ~ % curl -H 'x-api-key:XXXXX' https://xxx.execute-api.ap-northeast-1.amazonaws.com/dev/hoge -I
HTTP/2 403 
date: Tue, 31 Aug 2021 14:08:13 GMT
content-type: application/json
content-length: 0
x-amzn-requestid: 7abe8008-6295-450a-a364-dfefc553029b
x-amzn-errortype: MissingAuthenticationTokenException
x-amz-apigw-id: E72oMHlqtjMFgcQ=

レスポンスヘッダにx-amzn-errortype: MissingAuthenticationTokenExceptionが設定されていた。
公式ドキュメントによるとリクエストに認証トークンが設定されていないリソースパスが誤っていることが原因みたいである。
しかし、上記cURLコマンドでは認証ヘッダに正しい認証トークンを設定し、存在するリソースパスを指定している。

1日放置後、再度調査、確認をした。
ふと、Xオプションでメソッドを指定したらどうなるだろうと試したらエラーにならず、成功した。

satoukensuke@MacBook-Pro ~ % curl -X GET -H 'x-api-key:XXXXX' https://xxx.execute-api.ap-northeast-1.amazonaws.com/dev/hoge -I 
HTTP/2 200 
date: Tue, 31 Aug 2021 14:06:10 GMT
content-type: application/json
content-length: 0
x-amzn-requestid: 10274e95-3101-4085-abd7-e2645481d03a
access-control-allow-origin: *
x-amz-apigw-id: E72U9F6wtjMFmvQ=

vオプションで詳細を出力してみた。
どちらもGETで投げ、200が返されており、時間やリクエストIDなどの可変項目を除いて出力が異なる点はなかった。

エラーありコマンド

satoukensuke@MacBook-Pro ~ % curl -H 'x-api-key:XXXXX' https://xxx.execute-api.ap-northeast-1.amazonaws.com/dev/hoge -v
.
.
. TLSハンドシェイクに関するログ
.
.
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x7fbf7d80e800)
> GET /dev/hoge HTTP/2
> Host: xxx.execute-api.ap-northeast-1.amazonaws.com
> User-Agent: curl/7.64.1
> Accept: */*
> x-api-key:XXXXX
> 
* Connection state changed (MAX_CONCURRENT_STREAMS == 128)!
< HTTP/2 200 
< date: Tue, 31 Aug 2021 14:45:56 GMT
< content-type: application/json
< content-length: 0
< x-amzn-requestid: 7e365f1f-1cdb-44cf-91b6-a5eb5506a5f4
< access-control-allow-origin: *
< x-amz-apigw-id: E78JxE3UNjMF64Q=
< 
* Connection #0 to host xxx.execute-api.ap-northeast-1.amazonaws.com left intact
* Closing connection 0

エラーなしコマンド

satoukensuke@MacBook-Pro ~ % curl -X GET -H 'x-api-key:XXXXX' https://xxx.execute-api.ap-northeast-1.amazonaws.com/dev/hoge -v   
Note: Unnecessary use of -X or --request, GET is already inferred.
.
.
. TLSハンドシェイクに関するログ
.
.
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x7fa32300e800)
> GET /dev/hoge HTTP/2
> Host: xxx.execute-api.ap-northeast-1.amazonaws.com
> User-Agent: curl/7.64.1
> Accept: */*
> x-api-key:XXXXX
> 
* Connection state changed (MAX_CONCURRENT_STREAMS == 128)!
< HTTP/2 200 
< date: Tue, 31 Aug 2021 14:48:26 GMT
< content-type: application/json
< content-length: 0
< x-amzn-requestid: 66241212-4277-4964-9cc3-9c8f22d32604
< access-control-allow-origin: *
< x-amz-apigw-id: E78hJEf1NjMFTdg=
< 
* Connection #0 to host xxx.execute-api.ap-northeast-1.amazonaws.com left intact
* Closing connection 0