API GATEWAY PROXYって?
API GATEWAYから Lambdaなどにリンクする場合URIなどを具体的に設定しないといけないのだけど、 PROXYモードでまとめて全部Proxyされているサービスに投げることが可能なのだが。。。
例えば
``Link : https://.execute-api.ap-southeast-2.amazonaws.com//```
API IDが abcdef, stage が development とすると。
Link : https://abcdef.execute-api.ap-southeast-2.amazonaws.com/development/
で、これに例えば IDとPhoneを追加したい場合、 普通は リソースに IDとPhoneを追加して
/{id}/{phone}
https://abcdef.execute-api.ap-southeast-2.amazonaws.com/development/1234/81-50-1234-1234
これを PROXYサービスに変えると
https://abcdef.execute-api.ap-southeast-2.amazonaws.com/development/user?id=1234&phone=81-50-1234-1234
すげーべんりじゃん?! ってのは、ふつーにだれでもわかるんだけど・・
テストでハマった
最初にCORSが面倒、LAMBDAにPROXYしてるんだけど、LAMBDAでも CORSの設定が必要とか
下の例は、headers の アクセスコントロールとかを追加。
const returnvalue = {
statusCode: 200,
headers: {
'Access-Control-Allow-Origin' : '*',
'Access-Control-Allow-Headers':'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token',
'Access-Control-Allow-Credentials' : true,
'Content-Type': 'application/json'
},
body: JSON.stringify(response)
};
callback(null, returnvalue);
テストをしてみたけど えらーばかり リソースをヒットしていないのがテストが不可能な状態、 JqueryではHTTP OPTION, CORSではじかれ、CURLでも 403でおかしい。
なんで 403エラー?
パラメータのパスで問題だったのだが、なにせAWSのガイドを読んでもちんぷんかんぷん。ここでかなり無駄な時間。
jqueryで テストってことで ?ID=123
$.ajax({ url: "https://abcdef.execute-api.ap-southeast-2.amazonaws.com/development/?id=123",
type: "GET",
dataType: 'json',
crossDomain: true,
contentType: 'application/json',
success: function(data){
console.log(data);
}});
をなげてたのが403で弾かれまくり、 CURLでも同じく403、いろいろ検索したら リソースにヒットしてないのでは?ってことで、やっとわかったのが
https://abcdef.execute-api.ap-southeast-2.amazonaws.com/development/?id=1234
では だめで
https://abcdef.execute-api.ap-southeast-2.amazonaws.com/development/user?id=1234
USERってのが必要。。 (なんでやねんってかんじ)
これがちゃんと動くサンプル
$.ajax({ url: "https://abcdef.execute-api.ap-southeast-2.amazonaws.com/development/user?id="+id,
type: "GET",
dataType: 'json',
crossDomain: true,
contentType: 'application/json',
success: function(data){
console.log(data);
}});
さいごに・・・
AWSさん・・ 文章をもっとちゃんとしてくれ。 なにもかんでも403ってなんだよ。