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

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

ただいまの
回答率

90.04%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 315
退会済みユーザー

退会済みユーザー

実現したいこと

新規に簡単な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分でできるとか成功例だけがかかれていて
今回の場合エラーメッセージで検索しても意味がないので
デバッグの仕方やトラブルの対処的なブログがなくて困っています

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • mather

    2019/05/29 11:57

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

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2019/05/29 12:04 編集

    > 「とりあえず書いてあるとおりにやってみたけど何が起こってるかわからない」という状態に見えます
    まったくそのとおりなので初心者マークをつけさせていただきました
    >何をしたいか
    に関しては最終的にはパラメータをうけとって RDSにたてたMySQLを更新したいです
    APIサーバー自体は何度か作ったことがあるので
    Lambda の中に処理がとんでくればあとは処理自体は自力でかけると思うのですが
    現状コードの中を変更してもうんともすんともいわない状況です

    >まずはどこまでわかっていてどの部分が聞きたいこと
    APIやHTTPがどのように動くか仕組みはわかります
    ただ API Gateway や Lambda がどのような実装で動いてるかがわかりません

    API Gateway が Apache のように 443 をみはっていて
    そこにきたリクエストを Lambda 関数にかかれてあるメソッドにCGIのように飛ばしてくれる
    程度のイメージしかありません

    API作成前はレスポンスが帰ってこないので
    443番を受け付けてくれているというのはわかります

    {"message": "Internal server error"}

    というメッセージを Lambda が作っているのか API Gateway が返しているのかをまず知りたいです

    キャンセル

回答 2

checkベストアンサー

+1

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

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/30 17:04

    >API リソース ステージ メソッドがトリガーされてるか
    authorize_test
    詳細
    API エンドポイント: https://...
    メソッド: ANY
    リソースパス: /authorize_test
    認証: NONE

    という感じです

    >パラメータを渡してる場合は
    とりあえずはパラメータなしで固定のレスポンスでもいいので返したいです

    >デプロイはしてますか?
    してません
    いまはLambdaの中のコードを直接編集してます
    そもそもデフォルト状態でも動かなかったです

    キャンセル

  • 2019/05/31 10:49

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

    キャンセル

+1

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 16:51

    かわらなかったです

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

    キャンセル

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

  • ただいまの回答率 90.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる