###やろうとしていること
Amazon APIGatewayで作成したAPIにAWS_IAMの認証をつけ、ブラウザからjavascriptで叩きたい。
###問題の文章
調べたところ、AWSのドキュメントに下記の記述がありました。
API Gateway で生成された SDK を AWS 認証情報で初期化するには、次のようなコードを使用します。AWS 認証情報を使用すると、API に対するすべてのリクエストに署名が付与されます。これは、各リクエストに適切な CORS Accept ヘッダーを設定する必要があることを意味します。
javascript
1var apigClient = apigClientFactory.newClient({ 2 accessKey: 'ACCESS_KEY', 3 secretKey: 'SECRET_KEY', 4});
API Gateway で生成した JavaScript SDK を使用する
これらのコードは実際に使っていますが、上記文中の**「各リクエストに適切な CORS Accept ヘッダーを設定する必要があることを意味します」**の意味がよくわかっていません。認証をAWS_IAMに変更した場合は、CORSのためのヘッダーに何か特殊な設定をしなければならないのでしょうか。ここが分かる方、教えてください!
###前提・実現したいこと
Amazon APIGatewayで作成したAPI:"https://xxxxxx.execute-api.ap-northeast-1.amazonaws.com/test/"へのPOSTを、AWS_IAMで認証しようとしています。当該APIは、APIGatewayによって作成したAPI用のSDK(for Javascript)を使ってブラウザから呼び出そうとしています。
###発生している問題・エラーメッセージ
当該APIをPOSTすると、下記のエラーメッセージが返ってきます。
XMLHttpRequest cannot load https://xxxxxx.execute-api.ap-northeast-1.amazonaws.com/test/. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. The response had HTTP status code 403.
なお、下記の設定は完了しています。
- 当該APIのCORS有効化を行いました。
- 当該APIのPOSTメソッドの認証を「AWS_IAM」に変更しました。
- 当該APIの実行を許可するロールを、作成したCognito Identity PoolのUnauthUserに割り当てました。
- AWS.config.credentialでaccessKeyIdとsecretAccessKeyを取得し、apigClientの初期化を行いました。
これらの設定の内、当該APIのPOSTメソッドの認証を「AWS_IAM」→「なし」に戻すと、正常にAPIを呼び出すことが出来ています。
###該当のソースコード
javascript
1var accessKeyId, secretAccessKey; 2var apigClient = apigClientFactory.newClient(); 3$(function(){ 4//Credentialの初期化 5 AWS.config.region = 'ap-northeast-1'; // Region 6 AWS.config.credentials = new AWS.CognitoIdentityCredentials({ 7 IdentityPoolId: 'ap-northeast-1:xxxxxxxxxxxxxxxxxxxxxxx', 8 }); 9 AWS.config.credentials.get(function(err){ 10 if(!err){ 11 apigClient = apigClientFactory.newClient({ 12 accessKey: AWS.config.credentials.accessKeyId, 13 secretKey: AWS.config.credentials.secretAccessKey 14 }); 15 }else{ 16 console.log(err); 17 } 18}); 19 20}); 21$('#btn').click(function(){ 22 console.log('Click'); 23 var body = { 24 TableName: 'TestTable', 25 Key: 'samplekey', 26 Attr1: 'testAttribute' 27 }; 28 apigClient.rootPost({}, body, {}) 29 .then(function(result){ 30 console.log(result); 31 }).catch( function(result){ 32 console.log(result); 33 }); 34});
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。