初めてのサーバーレスアプリケーション開発 ~LambdaでDynamoDBの値を取得する~
前回はperson
を管理するためにDynamoDBでテーブルを作成しました。今回は第2回ということでDynamoDBから項目を取得するLambdaを作成していきます。
- 初めてのサーバーレスアプリケーション開発 ~DynamoDBにテーブルを作成する~
- 初めてのサーバーレスアプリケーション開発 ~LambdaでDynamoDBの値を取得する~
- 初めてのサーバーレスアプリケーション開発 ~API GatewayからLambdaを呼び出す~
↓追加しました。
- 初めてのサーバーレスアプリケーション開発 ~Serverless Framework を使ってAWSリソースをデプロイする~
- 初めてのサーバーレスアプリケーション開発 ~Serverless Framework と Codeシリーズを連携させる~
対象読者
- サーバーレスアプリケーション開発未経験の方
- サーバーレスに縁のないインフラエンジニアの方
本記事を実践して、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を作成して行きたいと思います。