LoginSignup
0
0

CURLで送信したJSONデータをlambdaで取得できなかった

Posted at

現象

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);
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0