質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Amazon SQS

Amazon SQS(Amazon Simple Queue Service)は、AWSが提供している分散型メッセージキューイングサービスです。APIを用いてアクセスすることが可能。これによって、アプリケーションのメイン処理と非同期に動いてほしい処理を分離することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Q&A

解決済

1回答

1632閲覧

[serverless flamework] SQSHandlerの中で外部APIを叩くことはできない?

kosuke_ikeura

総合スコア19

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Amazon SQS

Amazon SQS(Amazon Simple Queue Service)は、AWSが提供している分散型メッセージキューイングサービスです。APIを用いてアクセスすることが可能。これによって、アプリケーションのメイン処理と非同期に動いてほしい処理を分離することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

0グッド

0クリップ

投稿2020/08/18 05:41

前提・実現したいこと

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の知見がある方、ぜひお力添えいただきたいです。
よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Arahabica

2020/08/18 06:50

エラーメッセージはどうなっていますか?
kosuke_ikeura

2020/08/18 06:55

エラーメッセージはcloudwatchで確認しているのですが、何も出ません。
Arahabica

2020/08/18 13:35

すみません。よく読めば書いていましたね。。 sqshandlerから外部APIを叩けないってことはないはずなんですが、、、 外部APIの方に問題がある可能性がありますね。 APIを下記のURLに変えても動かないでしょうか? https://rsasage.s3-ap-northeast-1.amazonaws.com/ok.txt
guest

回答1

0

自己解決

解決できなかったため、上司に環境を作ってもらいました。。。
差異を比べると、tsconfig.jsonの設定が違っていたようでした。。
お騒がせしました。

投稿2020/08/24 02:25

kosuke_ikeura

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問