はじめに
DVA試験対策でAPI Gateway+Lambda構成にX-Rayを有効化して挙動を確認しました。
本記事では、この構成にX-Rayを有効化する方法を記載します。
X-Rayとは
API GatewayやLambda等、各サービスの処理時間を記録するサービス
処理時間をコンソール上で可視化
どの処理でボトルネックが発生しているかを特定できる
Lambdaでは、X-Ray SDKを使用することで、Lambda内のAWSサービスへのリクエスト処理時間も記録
構成
API Gateway+Lambda+DynamoDBの構成です。
Lambdaでは、DynamoDBテーブルにクエリし、返ってきたデータを返します。
・使用言語
Python(Lambdaでは3.9をランタイム環境として使用)
・開発環境
OS:Windows
Pythonバージョン:3.8.6
手順
DynamoDBテーブル作成
IDとユーザー名を持つテーブルを作成します。
DynamoDBのコンソール画面にて、「テーブルの作成」をクリック
テーブル名、パーティションキーを以下に設定し、他の設定はデフォルトでテーブルを作成
テーブル名:testtable
パーティションキー:ID(タイプ:数値)
作成したテーブルにレコード(DynamoDBでは項目と呼びます)を登録
テーブル画面で、アクション→項目を作成
「新しい属性の追加」ボタンをクリックし、username属性(タイプ:文字列)を追加します。
追加後、レコードを入力し、「項目を作成」をクリックします。
レコードが作成されたことを確認します。
「テーブルアイテムの探索」をクリックします。
返された項目欄に、登録したレコードが記録されていることを確認します。
X-Ray実行コードのパッケージをLambda Layerにデプロイ
X-Ray実行コードのパッケージをLambda Layerにデプロイします。
具体的には、X-Ray実行コードを含むディレクトリをzipし、zipファイルをLayerにデプロイします。
※Lambda Layer
Lambda Layerにコードを登録すると、Lambda関数からコードを参照できるようになります。
X-Rayは複数のLambda関数から呼び出すことが多いので、Layerにデプロイして、他Lambda関数から呼び出せるようにします。
X-Ray実行コードのパッケージを用意
まず、X-Ray実行コードを配置するディレクトリを用意します。
コマンドプロンプトを開き、コード配置ディレクトリに移動した後、以下のpip installコマンドを実行し、requestパッケージとX-Rayパッケージをインストールします。
$ pip install requests -t ./
$ pip install aws-xray-sdk -t ./
インストール後、X-Ray実行コードファイルを作成します。
以下がコードの中身です。
ファイル名:layer.py
from aws_xray_sdk.core import xray_recorder
from aws_xray_sdk.core import patch_all
patch_all()
ファイル編集後、X-Ray実行コードを含むディレクトリをzipにします。
X-Ray実行コードのパッケージをLambda Layerにデプロイ
Lambdaのコンソール画面に移動し、レイヤー→レイヤーの作成をクリックする。
以下項目を記載の通りに入力し、レイヤーを作成します。
名前:xray
説明:X-Ray実行コード(入れなくてもOK)
zipファイルをアップロードを選択し、↑でzip化したパッケージをアップロードします。
互換性のランタイム:Python 3.9
レイヤーコンソール画面に作成したレイヤーが表示されることを確認します。
Lambda関数作成
以下処理を実施するPythonコードをLambda関数として登録します。
DynamoDBテーブルにクエリ
クエリ結果をレスポンスに入れてreturn
Pythonコードの中身
"import layer"でLayerにデプロイしたX-Ray実行コードを読み込みます。
デプロイしたLambda Layerは、この後作成するLambda関数に紐づける必要があります。
紐づけはLambda関数作成後に実施します。
クエリIDは、テーブルに登録したレコードの値に設定します。
import json
import boto3
import layer
from boto3.dynamodb.conditions import Key
def lambda_handler(event, context):
#dynamodbにアクセス
queryID = 1
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table("testtable")
querydata = table.query(
KeyConditionExpression = Key("ID").eq(queryID)
)
if querydata["Count"] == 0:
username = "unknown"
else:
username = querydata["Items"][0]["username"]
return {
'statusCode': 200,
'body' : username
}
以下の内容でLambda関数を作成します。
関数名:test-xray
ランタイム:Python 3.9
Layerと同じランタイムにする必要があります!
他はデフォルトのままでOK
Lambdaのコードをデプロイします。
↑記載のコードをLambda関数のコードに貼り付けます。
貼り付け後、「Deploy」をクリックします。
Lambda関数に紐づくIAMロールに、DynamoDBの読み取り権限を付与します。
(デフォルトで作られるIAMロールにはこの権限が付与されていないため)
作成したLambda関数の画面に移動します。
設定→アクセス権限→ロール名をクリックします。
許可→許可ポリシーの「許可を追加」→「ポリシーをアタッチ」をクリックします。
AmazonDynamoDBReadOnlyAccessポリシーを選択し、「ポリシーをアタッチ」をクリックします。
(検索フォームでDynamoと検索すると出てきます。)
Lambda関数にX-Rayを有効化します。
Lambda関数画面の「設定」→「モニタリングおよび運用ツール」の「編集」をクリックします。
LambdaでX-Rayが実行されているか、コードを実行して確認します。
テストタブに移動し、以下内容でテストイベントを作成します。
イベントアクションをテスト:新しいイベントを作成
イベント名:test
他の設定はデフォルトのままで、「保存」をクリックします。
テストを実施します。
「テスト」ボタンをクリックします。
実行後、以下の結果が返ってくることを確認します。
{
"statusCode": 200,
"body": "Taro Tanaka"
}
AWS X-Rayが実行されているか確認します。
モニタリングタブに移動します。
Service Mapにて、下図のようにLambdaとDynamoDBが可視化されます。
さらに、Map下のIDをクリックすると、CloudWatchのX-Rayコンソール画面に移動し、詳細内容を確認できます。
CloudWatachのX-Rayコンソールの、セグメントのタイムライン欄で、DynamoDBへのクエリに要した時間が記録されていることが確認できます。
このように、X-Ray SDKを使うことで、Lambda関数内のAWSサービス呼び出しに要した時間も把握できます。
Lambda関数の設定は以上です。
次に、API Gatewayを作成します。
API Gatewayの作成
API Gatewayのコンソールに移動し、「APIを作成」をクリックします。
以下内容でREST APIを作成します。
REST選択
「新しいAPI」を選択
API名:testxray
エンドポイントタイプ:リージョン
API作成後、GETメソッドを作成します。
アクション→「メソッドの作成」をクリックします。
以下内容で設定し、「保存」をクリックします。
統合タイプ:Lambda関数
Lambdaプロキシ統合の使用:チェックを入れる
Lambdaリージョン:ap-northeast-1
Lambda関数:test-xray
デフォルトタイムアウトの使用:チェックを入れる
以下画面が表示されるのでOKをクリックします。
(Lambda関数ポリシーに、当該API Gatewayが関数を呼び出す権限を付与します)
これでAPI GatewayにLambda関数が紐づかれました。
Lambdaの画面に、API Gatewayが表示されていることも確認します。
(API GatewayとLambdaが紐づかれていることの確認です)
APIを実行できる状態にするために、API をデプロイします。
アクション→「APIのデプロイ」をクリックします。
以下の内容でデプロイします。
デプロイされるステージ:新しいステージ
ステージ名:任意
デプロイされたAPIにX-Rayを有効化します。
ログ/トレースタブの、「X-Rayトレースの有効化」にチェックを入れ、「変更を保存」をクリックします。
有効化後、APIのURLにブラウザでアクセスします。
以下のように、DynamoDBのテーブルの値が返ってくることを確認します。
以下画面のように、DynamoDBへの呼び出しも可視化されていることがわかります。
API全体の所要時間に加えて、Lambda処理のトータル所要時間、Lambda内のDynamoDB呼び出しの所要時間が可視化されています。
まとめ
API GatewayとLambdaにX-Rayを有効化することで、各コンポーネントの処理時間を可視化して把握することができます。
さらにLambdaにて、X-Ray SDKを使うことで、Lambda内の各AWSサービスへの呼び出しの所要時間も可視化されます。
X-Ray SDKも使うことで、より細かく各処理の所要時間を把握できるので、どの部分がボトルネックとなっているか知ることができそうです。
運用ではX-Ray SDKも利用するのが望ましいと感じました。
参考記事
https://qiita.com/mksamba/items/448c538236ab2989eba9
https://qiita.com/miyuki_samitani/items/f01f1bd49334f97fe84c
https://qiita.com/Ricordanza/items/d68d708e274e28b6bfa2