現象
lambda function URLを生成し、生成したURLにCURLコマンドでJSONデータをPOST送信したが、lambda側でJSONを取得できないケースがあった。JSONで送信したのは、base64にエンコードした画像データ。
curl -X POST -H "Content-Type: application/json" -d '{"base64String" : "data:image/jpeg;base64,/9j/4AAQSkZJ....."}' https://<xxxxx>lambda-url.ap-northeast-1.on.aws/
環境
- nodejs 18(AWS公式Docker用labmdaイメージ)
- curl 7.58].0
- Ubuntu 18.04.4 LTS(WSL2)
原因
lambdaに送信されてくるJSONデータがJSONまるごとbase64エンコーディングされていた。
lambdaに送られてくるデータは、JSONのbodyに設定されてくる。
{
version: '2.0',
routeKey: '$default',
rawPath: '/',
rawQueryString: '',
headers: {
'content-length': '25',
'x-amzn-tls-cipher-suite': 'ECDHE-RSA-AES128-GCM-SHA256',
'x-amzn-tls-version': 'TLSv1.2',
'x-amzn-trace-id': 'Root=1-64978c3d-1e7c165d60a237853cc90187',
'x-forwarded-proto': 'https',
host: 'xxxxxxxxxxxxxxxxxxxxxxxx.lambda-url.ap-northeast-1.on.aws',
'x-forwarded-port': '443',
'content-type': 'application/x-www-form-urlencoded',
'x-forwarded-for': 'xxx.xxx.xxx.24',
accept: '*/*',
'user-agent': 'curl/7.58.0'
},
requestContext: {
accountId: 'anonymous',
apiId: 'xxxxxxxxxxxxxxxxxxxxx,
domainName: 'xxxxxxxxxxxxxxx.lambda-url.ap-northeast-1.on.aws',
domainPrefix: 'xxxxxxxxxxxxxxxxxxx',
http: {
method: 'POST',
path: '/',
protocol: 'HTTP/1.1',
sourceIp: 'xxx.xxx.xxx.24',
userAgent: 'curl/7.58.0'
},
requestId: '90efa7c0-5ac6-4809-8cd4-4fe50cdfe713',
routeKey: '$default',
stage: '$default',
time: '25/Jun/2023:00:37:17 +0000',
timeEpoch: 1687653437125
},
body: 'eyJiYXNlNjRTdHJpbmciIDogInRlc3QifQ.........',
isBase64Encoded: true
}
なので、event.bodyを取得してパースしようとしたが、bodyにセットされているデータがbase64エンコーディングされているためパース時にエラーになる。
export const handler = async (event) => {
try {
const jsonData = JSON.parse(event.body);
対応
base64エンコードしている場合、送られてくるJSONに含まれているisBase64Encodedがtrueになる。そのため、isBase64Encodedを見てtrueの場合デコードするようにした。
【変更後】
let jsonMsg = event.body
if (event.isBase64Encoded){
jsonMsg = Buffer.from(event.body, 'base64').toString();
}
const jsonData = JSON.parse(jsonMsg);