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

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

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

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

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

2回答

5921閲覧

Lambda + API Gateway の初期作成について

退会済みユーザー

退会済みユーザー

総合スコア0

AWS Lambda

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

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

1グッド

3クリップ

投稿2019/05/29 02:36

編集2019/05/29 03:36

実現したいこと

新規に簡単なAPI作成を Lambda + API Gateway で作りたい

問題点

どちらもはじめて使うのでコードを変更するとこまでたどり着けなくて困っています

ほぼデフォルトで作成してみたのですが
{"message": "Internal server error"}
が出るだけで Lambda のコードの中を通ってるように見えません

やってみたこと

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-on-demand-https-example-configure-event-source_1.html
をみながら以下の手順で作成

設計図を使用 microservice-http-endpoint の使用 次の画面にいって 関数名 authorize_test 実行ロール:既存のロールを使用 既存のロール : すでに動いている lambda-role というのがあったので選択 API Gateway トリガー 新規API作成 セキュリティ:オープン 追加設定はデフォルト デプロイされるステージ default になっててここがよくわからないけどとりあえずそのまま これってステージングとプロダクションで同じ Lambda を使い回せるんでしょうか? メトリクスエラーログ有効化OFF バイナリメディアタイプ空欄 Lambda 関数コード 「関数の作成後にコードを設定できます」とあったので ランタイム Node.js 8.10 とデフォルトコードのまま関数作成 これで、 Lambda 関数「authorize_test」が正常に作成され、authorize_test-API がトリガーとして設定されました。[テスト] を選択してテストイベントを入力し、関数をテストします。 となってブロック図の画面が表示されて正常作成されたようです

API Gateway を選択するとエンドポイントが表示されるのでブラウザでたたいてみたところ
{"message": "Internal server error"}
となってしまいます

Lambda のデフォルトコードの最初に
console.log('Loading function');
とかかれているのですがこれはどこに表示されるのでしょうか

ここにたどりついていて以降のコードが悪いのか、
設定が悪くてコードの中にたどりついてないのか、
またどうやって調べればいいかもわかりません

いろいろブログを探してもすぐできるとか簡単にできるとか10分でできるとか成功例だけがかかれていて
今回の場合エラーメッセージで検索しても意味がないので
デバッグの仕方やトラブルの対処的なブログがなくて困っています

原因のわかる方助けていただけないでしょうか
あるいはトラブルシューティング的な初心者用ブログ記事を紹介していただけると助かります

mypt👍を押しています

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

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

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

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

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

mather

2019/05/29 02:57

「とりあえず書いてあるとおりにやってみたけど何が起こってるかわからないし何をしたいのかもわからない」という状態に見えます。まずはどこまでわかっていてどの部分が聞きたいことなのか、明確にしてください。
退会済みユーザー

退会済みユーザー

2019/05/29 03:08 編集

> 「とりあえず書いてあるとおりにやってみたけど何が起こってるかわからない」という状態に見えます まったくそのとおりなので初心者マークをつけさせていただきました >何をしたいか に関しては最終的にはパラメータをうけとって RDSにたてたMySQLを更新したいです APIサーバー自体は何度か作ったことがあるので Lambda の中に処理がとんでくればあとは処理自体は自力でかけると思うのですが 現状コードの中を変更してもうんともすんともいわない状況です >まずはどこまでわかっていてどの部分が聞きたいこと APIやHTTPがどのように動くか仕組みはわかります ただ API Gateway や Lambda がどのような実装で動いてるかがわかりません API Gateway が Apache のように 443 をみはっていて そこにきたリクエストを Lambda 関数にかかれてあるメソッドにCGIのように飛ばしてくれる 程度のイメージしかありません API作成前はレスポンスが帰ってこないので 443番を受け付けてくれているというのはわかります {"message": "Internal server error"} というメッセージを Lambda が作っているのか API Gateway が返しているのかをまず知りたいです
guest

回答2

0

Lambdaがデフォルトコードのままということであれば、Lambda関数は問題なさそうですが、API GatewayがAuthorizerを呼び出したところでコケているような気がします。

AuthorizerはIAMポリシーを返却する必要があるので、次のようにしてみてください。

exports.handler = function(event, context, callback) { callback(null, generatePolicy('user', 'Allow', event.methodArn)); }; var generatePolicy = function(principalId, effect, resource) { var authResponse = {}; authResponse.principalId = principalId; if (effect && resource) { var policyDocument = {}; policyDocument.Version = '2012-10-17'; policyDocument.Statement = []; var statementOne = {}; statementOne.Action = 'execute-api:Invoke'; statementOne.Effect = effect; statementOne.Resource = resource; policyDocument.Statement[0] = statementOne; authResponse.policyDocument = policyDocument; } return authResponse; }

投稿2019/05/30 01:14

moonphase

総合スコア6621

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

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

退会済みユーザー

退会済みユーザー

2019/05/30 07:51

かわらなかったです 一応こんな感じで最低限の固定レスポンスを返すようにしてもだめでした この関数自体に処理がとんできてないように思います exports.handler = (event, context, callback) => { callback(null, { statusCode: 200, body: {"success": "OK"} }, headers: { 'Content-Type': 'application/json', } }); };
guest

0

ベストアンサー

Lambda のデフォルトコードの最初に

console.log('Loading function');
とかかれているのですがこれはどこに表示されるのでしょうか

https://qiita.com/keitakn/items/02fcee5bbb037bbd2e41

これぐらいは調べれば出てくると思います

ただ症状的に API Gateway 側が怪しいですが
本当にLambdaと正しいAPI リソース ステージ メソッドがトリガーされてるか
パラメータを渡してる場合はパラメータのマッピングでLambdaにJSON型が渡っているか
Lambda側のハンドラメソッド名が正しいかもう1度確認してみてください

あとデプロイはしてますか?

投稿2019/05/29 16:37

編集2019/05/29 16:39
mypt

総合スコア170

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

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

退会済みユーザー

退会済みユーザー

2019/05/30 08:04

>API リソース ステージ メソッドがトリガーされてるか authorize_test 詳細 API エンドポイント: https://... メソッド: ANY リソースパス: /authorize_test 認証: NONE という感じです >パラメータを渡してる場合は とりあえずはパラメータなしで固定のレスポンスでもいいので返したいです >デプロイはしてますか? してません いまはLambdaの中のコードを直接編集してます そもそもデフォルト状態でも動かなかったです
退会済みユーザー

退会済みユーザー

2019/05/31 01:49

アクションの中にデプロイというのがあってやってみたら動きました! これをやることで何がどうかわったのかよくわからないのですが 設定しただけではだめでどこかに何かを反映させる必要があったということでしょうか 本当にありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問