- 新しい順
- 投票が多い順
- コメントが多い順
API Gatewayの後ろにあるLambdaのレスポンスでAccess-Control-Allow-Originなどは含んでいますか?
以下のドキュメントに記載されているようなレスポンスを返すようにコードを作成する必要があると思います。
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/how-to-cors.html#apigateway-enable-cors-proxy
~~すみませんが解決したと思ったのですがそうではなかったっぽいので、追加で質問です。 この構成だとどうもcorsエラーは起きないものの 500エラーの(Internal Server Error)が出てしまうのですが もしかするとPOSTメソッドにlambdaプロキシ統合をするのは間違っているのでしょうか。
APIGatewayにLambda呼び出し権限が無いのかな? と思ってPOSTメソッドの統合リクエストにて 以下のポリシーを付与したIAMロールのARNも設定してみたのですがダメでした… (参考:https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/permissions.html)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "lambda:InvokeFunction",
"Resource": "*"
}
]
}
こちらのサイト https://qiita.com/tetsu0831/items/220ba032116dc94063b3 ではlambdaプロキシ統合せずに POSTの統合リクエストにマッピングテンプレートで content-typeにmultipart/form-dataを設定しているので 不安になってきました… しかし、lambdaプロキシ統合のチェックを外すと今度はcorsエラーが再び発生するので どうしたらいいものか…~~
→自己解決しました… →pdfファイルをlambdaコードが単純に悪かったみたいです
関連するコンテンツ
- AWS公式更新しました 4年前
一応以下のようなコードですがこれではだめでしょうか。
また、最初のjs側で出ているのでそもそも s3 → apigateway → Lambda の経路を通る場合は、Lambdaコードは今回は関係ないかと思っているのですが違いましたかね…
import json import boto3 import base64
s3 = boto3.client('s3')
def lambda_handler(event, context): try: bucket_name = 'xxxxx' body = event['body'] file_data = base64.b64decode(body['file']) # bodyのファイルをbase64形式へエンコード file_name = 'xxxxx.pdf'
レスポンスにAccess-Control-Allow-Originが含まれているので問題無いと思います。 設定内容的にも普通にリクエストが成功しそうな気がしています。 https://qiita.com/g_ogawa/items/b10999954788d202e0ff
ちなみにPostmanやcurlコマンドを使用してAPI Gatewayにアクセスした際にレスポンスヘッダーにAccess-Control-Allow-Originが含まれているか確認できますか? https://qiita.com/takc923/items/1b508bb370c78b7a9d44
他にも念のための確認ですが、フロントエンド (JavaScript) からリクエストを送っているAPI Gatewayのエンドポイントは正しいですか? エンドポイントが誤っている場合にもCORSエラーが発生します。 https://teratail.com/questions/3f4mwk5iwfwnqh
index.htmlの内容は以下の通りです。(<script>にjsを含む)
Invokeコマンドでも使用したAPIGatewayのPOSTメソッドのURLをそのままコピペで張り付けてます。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>○○</title> </head> <body> <h1>○○</h1> <form id="uploadForm" enctype="multipart/form-data"> <input type="file" id="pdfFile" name="pdfFile" accept="application/pdf" required> <button type="submit">PDFをアップする</button> </form> <script> document.getElementById('uploadForm').addEventListener('submit', async function(event) { event.preventDefault(); const file = document.getElementById('pdfFile').files[0]; const formData = new FormData(); formData.append('file', file); </body> </html>一応パワーシェルのコマンドですが以下の回答が来まして Access-Control-Allow-Originは含まれているように見えます。
●実行コマンド(PowerShell) Invoke-WebRequest -Method Post 'https://○○○.execute-api.ap-northeast-1.amazonaws.com/test/fileupload'
●結果 StatusCode : 200 StatusDescription : OK Content : {"statusCode": 500, "headers": {"Access-Control-Allow-Origin": "*", "Access-Control-Allow-Methods": "OPTIONS,POST", "Access-Control-Allow-Headers": "Content-Type,X-Amz-Date,Authorization,X-Api-Key,X -A... RawContent : HTTP/1.1 200 OK Connection: keep-alive x-amzn-RequestId: a891c287-729c-4733-8426-01f4a5c96103 Access-Control-Allow-Origin: * x-amz-apigw-id: cB-LFGTMNjMEgXQ= X-Amzn-Trace-Id: Root=1-66b0aa46-5dc3... Forms : {} Headers : {[Connection, keep-alive], [x-amzn-RequestId, a891c287-729c-4733-8426-01f4a5c96103], [Access-Contro l-Allow-Origin, *], [x-amz-apigw-id, cB-LFGTMNjMEgXQ=]...} Images : {} InputFields : {} Links : {} ParsedHtml : mshtml.HTMLDocumentClass RawContentLength : 262
コマンド結果は以上です。
原因が分かったかもしれません。 API Gatewayはボディサイズが10MBまでしか対応していません。 https://qiita.com/akatsukaha/items/2ba0d709835899dae8dd https://dev.classmethod.jp/articles/tsnote-api-gateway-please-tell-me-why-request_too_large-occurs-on-api-gateway-even-when-the-file-size-is-10-mb-or-less/
試しにサイズを圧縮したPDFファイルをアップロードしてみました。 サイズが2MBくらいのPDFをアップロードしてみたところLambdaまでリクエストが通るようになりました。
なので、ファイルサイズを小さくするかAPI Gatewayを回避する方法 (具体的には以下のブログで紹介されているようなS3署名付きURLを使用した方法) で対応する必要があります。 https://aws.amazon.com/jp/blogs/news/large-size-files-transferring-by-serverless-s3presignedurl-and-clientside-javascript/