LoginSignup
2

More than 3 years have passed since last update.

サーバーレスに触れる

Posted at

はじめに

APIGateway、Lambda、DynamoDBを使って
簡単なサーバーレスアプリケーションを作成して
サーバレスに触れてみようと思います。
自分用の備忘録として記述しようと思います。
image.png

1.DynamoDBを作成

DynamoDBの説明はこちらを参考にしてみて下さい。

テーブル作成

コンソール画面からDynamoDBの画面に移動します。
そして[テーブル作成]をクリック。
image.png

テーブル名、プライマリキーを入力します。
今回はそれぞれtest-item,item_idと設定しました。
image.png

これで作成ボタンを押すと作成されます。
image.png

テーブルの項目を追加

作成したテーブルの項目を追加していきます。
image.png

初期の状態ではプライマリキーで設定したitem_idしか入っていません。
image.png

作成したテーブルにitem_idと紐づくnameを追加します。
image.png

item_idnameの中身を入力して保存します。
image.png

項目の中身があることを確認できます。
image.png

同じように二つの項目も追加します。
image.png

2.Lambdaの作成

Lambdaについては、こちらを参照してみて下さい。

IAMロールの作成

LAmbdaの作成の前にIAMロールを作成します。
IAMロールは、EC2やLambdaなどのAWSリソースに権限を付与するために使用します。

コンソール画面から「IAM」を選択して「ロール」から[ロール作成]をクリックします。
image.png

Lambdaに対するロールを作成するため、Lambdaを選択して
[次のステップ:アクセス権限]をクリック
image.png

作成するロールに権限を付与します。以下の二つが対象になります。

  • ログの書き込み権限:AWSLambdaBasicExecutionRole
  • DynamoDBへのアクセス権限:AmazonDynamoDBFullAccess

image.png

image.png

ポリシーの選択が完了したら[次のステップ]を選択して
ロール名を入力します。
完了したら[ロールの作成]をクリックします。

image.png

Lambdaの作成

コンソール画面から「Lambda」を選択します。
[関数の作成]をクリックします。
image.png

「一から作成」を選択したまま
image.png

名前、ランタイム、ロールを入力していきます。
関数名はget-item-test、ランタイムはpython、実行ロールは上記で作成したロールを選択しています。
image.png

[関数の作成]をクリックすると完成します。
image.png

Lambda関数の作成

初期のLambdaではテストが成功するとHello from Lambda!が表示されるような内容になっています。
image.png

この関数をDynamoDBから値を取得する関数に変更していきます。

import boto3

dynamodb = boto3.resource('dynamodb')
table    = dynamodb.Table('test-item')

def get_item(id):
    response = table.get_item(
            Key={
                 'item_id': id
            }
        )
    return response['Item']

def lambda_handler(event, context):
    item = get_item('001')
    return item

get_itemメソッドでitemの情報を取得しています。

これを保存して[テスト]をクリックします。
そうするとitem_idに関連したnameが取れることが確認できます。
image.png

3.API Gatewayの作成

API Gatewayについてはこちらを参考にしてみて下さい。

API作成

APIを作成していきます。
API名を記入して[APIの作成]をクリックします。
image.png

メソッド作成

「アクション」から「メソッドの作成」を選択します。
image.png

「GET」を選択してチェックマークをクリックします。
image.png

Lambda関数に作成したLambda名を記入して保存します。
image.png

テスト

Lambda関数を呼び出すテスト実施します。
image.png

[テスト]をクリックします。
image.png

そうすると成功しました。
image.png

マッピングテンプレート

現在の状況だとLambda実行されたときに、idが001のものが呼び出されます。
これをAPI Gatewayからidを指定して引き渡せるようにしていきます。

「統合リクエスト」をクリックします。
image.png

マッピングテンプレートを追加します。
image.png

「Content-Type」にapplication/jsonと記入し、保存します。
image.png

テンプレート内容を以下のように記述します。

"item_id" : "$input.params('item_id')"

これで保存します。
image.png

Lambda修正

API Gatewayからidを取得して、それに紐づく情報をDynamoDBから取ってくるようにLambdaを修正します。

Lambdaの画面の関数コードかlambda_handlerメソッドを以下のように修正します。

def lambda_handler(event, context):
    item = get_item(event['item_id'])
    return item

image.png

これを保存します。

APIのデプロイ

最後にAPIのデプロイをしてインターネットのURLから叩けるようにします。

APIの画面の「アクション」から「APIのデプロイ」を選択します。
image.png

ステージ名を記入して[デプロイ]をクリックします。
image.png

URLが作成されます。
image.png

このURLの後ろにitem_id=001を付けてブラウザから送ってみます。

https<ステージ名>/test?item_id=001のようなURLをブラウザで叩くと
画面に以下の内容が表記されれば成功です。
image.png

試しにid002003にするとそれに紐づいたnameが返ってくると思います。

まとめ

この資料を参考に今回はDynamoDB、API Gateway、Lambdaを使った開発をしてみて一連の流れがなんとなく理解できた。
これからもっとサーバレスへの理解を深めるために様々なサービスに触れてみたいと思っています。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2