Help us understand the problem. What is going on with this article?

AWSのLambdaとDynamoDBとAPIGatewayの連携

More than 3 years have passed since last update.

2017/7/8 現在の情報です。

作る順番

DynamoDB→Lambda→APIGatewayの順番に作っていきます。

下準備~IAMロールの作成~

IAMにロールの作成が必要です。
今回はLambdaからDynamoDBを呼び出させるので先に以下作業を行っておきます。

IAM > ロール > 新しいロールの作成

ロールタイプの選択画面が出るので、「AWS Lambda」を選択
ポリシーの設定画面が出るので

  • AmazonDynamoDBFullAccess
  • AWSLambdaDynamoDBExecutionRole

を選択します。
※他の記事を読むと、「AWSLambdaDynamoDBExecutionRole」だけで良いと書いてあったんですが
 なんかダメでした。

名前決めろって言われるので適当に「lambda-dynamodb-execution-role」とかにします。

で、ためらわず作成。

DynamoDBの設定

DynamoDBの画面よりテーブルの作成ボタンを押す
テーブル名、PKを決めろって言われるので適当に決める。
今回は適当にHogeテーブル、fugaカラム名にします。

しばらくしたら出来上がるので、項目タブ > 項目作成
ここでキー以外の項目を追加できます。piyoを追加しましょう。
追加する時についでに値も入れられるようです。

分かりにくいので図。

dynamo.png

左の方にあるプラスを押すと項目が増えていきます。
型を設定して、値を入れたら保存。するとpiyoカラムが追加されて、ついでに値も入ります。

はい、これでDynamoDBの設定は終わりです。簡単ですね。

Lambdaの設定

はい、次はLambdaです。

Lambdaの画面でためらわず、Lambda関数の作成を押します。

設計図の選択と言われるので、何言ってるか分からないからBlankFunctionを選びます。
トリガーの設定画面が出ますが、何かよく分からんので次へ。
はい、次の画面、大事です。

名前:fugafuga
説明:ぴよぴよ
ランタイム:Node.js 4.3
Lambda 関数のコード
 コードをインラインで編集 を選ぶ。

こんな感じのコードを書きましょう。

var AWS = require('aws-sdk');
var dynamo = new AWS.DynamoDB({
    region: 'ap-northeast-1'
});
exports.handler = function(event, context) {
    var params = {
        "TableName": "Hoge",
        "KeyConditionExpression":"fuga = :fugafuga",
        "ExpressionAttributeValues": {
            ":fugafuga" : {"S": event.fugafuga}
        }
    };
    console.log("event:", event);
    dynamo.query(params, function(err, data) {
        console.log("dynamo_data:", data);
        console.log("dynamo_err:", err);
        context.done(null, data);
    });

};

node.js読めなくても雰囲気でわかると思います。
Dynamoにつないで、Hogeテーブルのfugaテーブルがevent.fugafugaで取得した値と
同じものを取得しそうですね。

その下の方の「Lambda 関数ハンドラおよびロール」の設定。
ハンドラを「exports.handler」と入力して下さい。
そして、ついに出ました。ロールで最初に作った「lambda-dynamodb-execution-role」を選択します。

次へ、関数を作成をためらわずに押します。

Lambdaのテスト

テストしてみましょう。
関数作ったら上の方に嫌でも目につくテストボタン。押してみます。

謎の入力画面。パラメータを指定できそうなのでこんな感じで入力します。

{
  "fugafuga": "ThisisKey"
}

はい、やったね。上手くいきました。

{
  "Items": [
    {
      "fuga": {
        "S": "ThisisKey"
      },
      "piyo": {
        "S": "piyopiyopiyo"
      }
    }
  ],
  "Count": 1,
  "ScannedCount": 1
}

ぴよぴよ言ってますね。

APIGatewayの設定

はい、APIGatewayです。何のためらいもなく、APIの作成ボタンを押しましょう。

新しいAPIです。API名は適当に「piyopiyo」、説明も適当に「ぴよぴよ」と入力しましょう。
するとこんな画面になります。まずはメソッドを作りましょう。
このセレクトを選んで下さい。

apigateway.png

中身を取得したいのでGETメソッドを作りましょう。
すると何か聞かれるので「統合タイプ:Lambda関数」を選びます。せっかく作ったしね。
リージョンはap-northeast-1、Lambda関数はfugafugaでした。

保存ボタンを押すと、何か怖そうなダイアログが出ますが、怖くない、怖くない。
OKしましょう。

するとなんかイケてる画面になります。
この画面が、どこからどうAPIが呼び出されて、その後何を呼び出して、何を返すのか。
禅問答みたいですね。

apigateway2.PNG

パラメータの設定

APIたるものパラメータを受けて渡す必要があるでしょう。
まず受け方は、↑の図の「メソッドリクエスト」をクリックします。
すると色々設定デキそうですが今回は「URL クエリ文字列パラメータ」を設定します。
適当に「fuga」を設定します。これでfugaパラメータを受け取れるようになりました。

次に「統合リクエスト」をクリックします。
ここでは、APIGatewayからLambdaにパラメータを渡す設定をします。

本文マッピングテンプレートが隠れているので展開して
「リクエスト本文のパススルー」を「テンプレートが定義されていない場合 (推奨) 」を選択
その下の「マッピングテンプレートの追加」を押します。
するとContentTypeが設定できるので「application/json」を選択。
しかしひどいUI。

すると、その下に謎の入力箇所が現れるので、ここでやっと引き渡す値を設定できます。

{
    "fugafuga": "$input.params('fuga')"
}

はい、意味分からんですね。
$input.params('fuga') は、APIGatewayが受ける変数です。?fuga=XXX みたいな感じです。
で、左の"fugafuga"は、Lambdaのeventが受け取る変数名になります。
うえーーの方のLambdaのプログラムでevent.fugafuga って書いてたアレに入ります。

最後。「メソッドレスポンス」を選択。
普通に返却すると日本語が化けるらしく、「本文マッピングテンプレート」にこれを設定します。
「application/json;charset=UTF-8」
もともとあった「application/json」は消します。

これで完成。

APIのデプロイから実行

はい、後はAPIをデプロイすれば使えます。
ここからデプロイを選びましょう。

apigateway3.PNG

デプロイされるステージ:新しいステージ
ステージ名:develop
説明:適当に。
ステージは本番、開発を分けるためのタグですね。
実際は何でも大丈夫です。

はい、デプロイするとURLが発行されます。
https://XXXXXX-api.ap-northeast-1.amazonaws.com/develop
みたいな感じになりますね。

これを押すと、nullが表示されると思います。寂しい。
なぜならパラメータが必要だから。
じゃあパラメータfugaを付けてみましょう。
https://XXXXXX-api.ap-northeast-1.amazonaws.com/develop?fuga=ThisisKey

{"Items":[{"fuga":{"S":"ThisisKey"},
"piyo":{"S":"piyopiyopiyo"}}],"Count":1,"ScannedCount":1}

やった!DynamoDBに入れた値が取れましたね。

はい、これで一連の作業はおしまいです。
結構調べながらやると、管理画面が過去の文言だったりフローが変わってたりと
罠が多かったので2017/7/8時点の情報でまとめました。
誰かの役に立つといいなー:sunny:

tentatsu
好きな食べ物はうなぎといちごです。略してうなごですね。 最近はDB設計やら、システム設計やら、受託やら システムに関連するお仕事何でもやっています。 オフショアチーム持っているので、大きめのプロジェクトもどんとこい。 公開中のサービス: アイコンサーチ http://icon-search.jp/ ことさが http://cotosaga.com/
https://arcplg.com
archipelago
【つくりこみファースト】みんなが活用できる技術で、クリエィティブに専念できる世界を!
http://arcplg.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away