前提・実現したいこと
severless flamework
aws lambda
aws sqs
に関する質問です。
使用している言語は、typescript+nodejsです。
やりたいこと
sqsにメッセージを受信したらlambdaが起動し、そのメッセージをもとに、
1 jsonファイルを作成→
2 取得したjsonファイルのデータから一部外部のapiを叩いてデータを追加→
3 完成したデータをもとにcsvファイルを作成
ということを行いたいです。
しかし、2の外部のapiを叩くことができません。。
今一番予想しているのは、SQSHandlerのなかで外部APIを叩けない仕様になっているのではないかと思っています。apiとしてデプロイすると動くことは確認済みなのですが、sqsでデプロイすると動かないためです。
エラーも出してくれないため、内部でどんなことが起きているのかもわかりません。。
serverless/lambdaの知見がある方、ぜひお力添えいただきたいです。
該当のソースコード
handler.ts
typescript
1import { SQSHandler } from 'aws-lambda'; 2import 'source-map-support/register'; 3import fetch from 'node-fetch' 4 5export const hello: SQSHandler = async (event, _context) => { 6 //sqsに受信されるメッセージをjsonで取得 7 const data = JSON.parse(event.Records[0].body); 8 9 //jsonファイルからデータを変数に格納するコードは省略します 10 11 //sqsから作成したjsonファイルのみではデータが不足しているため、外部apiを叩いて不足しているデータを取得、その際に条件分岐する必要がある。apiUrlはapiを叩くためのurlを格納するための変数。 12 let apiUrl = `` 13 if (itemAlias.variant_title) { 14 const variantId = itemAlias.variant_id; 15 apiUrl = `https://url${variantId}.com` //適当な文字列にしています。 16 } 17 if (!itemAlias.variant_title) { 18 const productId = itemAlias.product_id; 19 apiUrl = `https://url${productId}.com` //適当な文字列にしています。 20 } 21 22 console.log(apiUrl); //出力される 条件分岐はうまくいき、apiを叩くためのurlを取得できていること確認 23 24 (async () => { 25 try { 26 await console.log('hellohello'); //出力されるため、この即時実行関数に問題ないことは確認。 27 const metaFieldJson = await fetch(apiUrl); 28 await console.log(metaFieldJson); //出力されない fetchがうまくいっていない様子。エラーも出力されない。 29 const kikakuList = await metaFieldJson.json(); 30 let kikakuList1 = `` 31 if (itemAlias.variant_title) { 32 kikakuList1 = await kikakuList.metafields[0].value; 33 } 34 if (!itemAlias.variant_title) { 35 kikakuList1 = `` 36 } 37 const kikakuList2 = await kikakuList.metafields[1].value; 38 39 //csvを作成するコードは省略します 40 41 } catch (error){ 42 console.log(error); 43 } 44 })(); 45};
serverless.ts
typescript
1import { Serverless } from 'serverless/aws'; 2 3const serverlessConfiguration: Serverless = { 4 service: { 5 name: 'xxxxxxx', 6 }, 7 frameworkVersion: '>=1.72.0', 8 custom: { 9 webpack: { 10 webpackConfig: './webpack.config.js', 11 includeModules: true 12 } 13 }, 14 // Add the serverless-webpack plugin 15 plugins: ['serverless-webpack'], 16 provider: { 17 name: 'aws', 18 runtime: 'nodejs12.x', 19 apiGateway: { 20 minimumCompressionSize: 1024, 21 }, 22 environment: { 23 AWS_NODEJS_CONNECTION_REUSE_ENABLED: '1', 24 }, 25 }, 26 functions: { 27 hello: { 28 handler: 'handler.hello', 29 events: [ 30 { 31 sqs: { 32 arn: 'xxxxxxxx' 33 } 34 } 35 ] 36 } 37 } 38} 39 40module.exports = serverlessConfiguration;
試したこと
apiとしてデプロイしたらうまく動作しました。
しかし、sqshandlerのなかでfetchするとうまく動作しません。。
serverless/lambdaの知見がある方、ぜひお力添えいただきたいです。
よろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー