初めてのサーバーレスアプリケーション開発 ~LambdaでDynamoDBの値を取得する~

前回はpersonを管理するためにDynamoDBでテーブルを作成しました。今回は第2回ということでDynamoDBから項目を取得するLambdaを作成していきます。

↓追加しました。

対象読者

  • サーバーレスアプリケーション開発未経験の方
  • サーバーレスに縁のないインフラエンジニアの方

本記事を実践して、API Gateway、Lambda、DynamoDBと仲良くなりましょう!!

それでは本題に入っていきます。

サーバーレスアプリケーション超入門

今回構築するアプリケーションの全体構成はこちら。

今回は前回作成したDynamoDBからデータを取得するLambda関数を作成していきます。

Lambda

Lambdaとは何なのか。公式ドキュメントよりLambdaの概要を抜粋します。

AWS Lambda を使用すれば、サーバーのプロビジョニングや管理なしでコードを実行できます。課金は実際に使用したコンピューティング時間に対してのみ発生し、コードが実行されていないときには料金も発生しません。

Lambda を使用すれば、実質どのようなタイプのアプリケーションやバックエンドサービスでも管理を必要とせずに実行できます。コードさえアップロードすれば、高可用性を実現しながらコードを実行およびスケーリングするために必要なことは、すべて Lambda により行われます。コードは、他の AWS サービスから自動的にトリガーするよう設定することも、ウェブやモバイルアプリケーションから直接呼び出すよう設定することもできます。

また、このエントリにLambdaの特徴が綺麗にまとまっていたので一部抜粋します。

Lambdaの特徴

  • 対応言語で記述したコードを保存し、リクエスト(トリガーイベント発生)の都度自動実行するサーバーレスコンピューティングサービス
  • 高可用性を発揮するよう設計されており、定期的なダウンタイムはない
  • リクエスト受信の回数に合わせて自動的にスケール
  • リクエストとコードを実行するために要した処理時間の分のみ料金が発生

もう少し詳しく知りたい方は、Black Beltの資料もご覧ください。※資料は最新のものではないため適宜公式ドキュメントを参照してください。

Lambdaの利用用途は様々です。いくつか制限事項はありますが、割と手軽に利用できるサービスになります。

今回作成するアプリケーションでは、DynamoDBからデータを取得する関数として利用します。DynamoDBから情報を取得する際にはDynamoDBのKeyであるperson_idを元にデータを取得します。

Lambdaを作ってみよう

Lambdaはプログラミング言語として、Node.js (JavaScript)、Python、Java (Java 8 互換)、C# (.NET Core)、および Go をサポートしています。今回はこの言語の中でも比較的記述しやすい言語であるPythonを使ってコーディングしていきます。

では、早速作ってみましょう。

1.1.IAMロールの作成

まずは、IAMロールを作成します。IAMロールとはすごく簡単にいうとAWSのリソースに対して権限を割り当てるための仕組みです。今回はLambda関数用のIAMロールを作成します。

AWSマネジメントコンソールよりIAMを選択します。

左ペインのロールを選択し、「ロールの作成」をクリックします。

次に当該ロールを付与する対象を選択します。今回はLambdaに対するロールを作成するため、Lambdaを選択し「次のステップ:アクセス権限」をクリックします。

Lambdaロールに付与する権限を選択します。今回はログの書き込み権限をもつAWSLambdaBasicExecutionRoleとDynamoDBへのアクセス権限をもつAmazonDynamoDBFullAccessをポリシーとしてアタッチします。

※今回は便宜上AmazonDynamoDBFullAccessをアタッチしましたが、実運用する場合は権限を絞ったポリシーをアタッチすることをおすすめします。

どのような権限が付与されるのか。。もう少し詳細が知りたい!!という方は「ポリシーの概要」を確認してみましょう。

AWSLambdaBasicExecutionRoleはCloudWatchlogsというサービスに対して書き込み権限があることがわかります。さらに詳しく知りたい方はこちらのエントリをご確認ください。

アタッチするポリシーが選択し終えたら、次にロール名を入力します。demo-lambda-roleと入力し、「ロールの作成」をクリックします。

これでIAMロールの作成は完了です。

1.2.Lambda関数の作成

AWSマネジメントコンソールよりLambdaを選択します。

画面右上の「関数の作成」をクリックします。

関数の名前、ランタイム、ロールを指定します。今回は関数名としてdemo-get-person、ランタイムとしてPython 3.6、ロールに先ほど作成したdemo-lambda-roleを指定します。

1.3.Lambda関数のテスト

関数が作成されたので、現状で一度テストしてみましょう。画面右上の「テスト」をクリックします。

"Key1""value1"などがJsonとして表示されています。これはテスト実行時に引数としてLambda関数に渡されるeventとなります。今回は一旦そのままの値とします。イベント名にtestを入力し「作成」をクリックします。

この状態で、「テスト」をクリックします。

「Hello from Lambda」がログとして表示されればOKです。

1.4.Lambda関数の変更

DynamoDBから値を取得するために関数を変更します。変更後は画面右上の「保存」をクリックします。

import boto3
 
dynamodb = boto3.resource('dynamodb')
table    = dynamodb.Table('demo-person')
 
def get_person(id):
    response = table.get_item(
            Key={
                 'person_id': id
            }
        )
    return response['Item']
         
def lambda_handler(event, context):
    person = get_person('001')
    return person

簡単に処理の概要を説明します。

  • 1行目:AWS SDK for Pythonであるboto3をインポート
  • 6〜12行目:person情報を取得する関数
  • 14〜16行目:メイン関数

PythonからAWSのリソースにアクセスするためにboto3をインポートします。今回はDynamoDBを操作しますが、それ以外のリソースを操作する時にもboto3をインポートします。boto3で実行することができる関数はこちらのドキュメントに記載されています。

今回は、boto3.resource('dynamodb')get_item関数を実行しています。 この関数でDynamoDBからperson_idに紐付くデータを取得しています。

※メイン関数の部分は後ほど修正しますが、今はこのままにしておきます。

1.5.Lambda関数のテスト

先ほどと同様にLambda関数をテストします。「テスト」をクリックすると。。

DynamoDBから値が取得できていることが確認できます。

さいごに

簡単なアプリケーションを構築するためLambdaを作成しました。初めてのサーバーレスアプリケーション開発 ~API GatewayからLambdaを呼び出す~では今回作成したLambdaをインターネット経由で実行するためにAPI Gatewayを作成して行きたいと思います。