1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【ハンズオン】API Gateway+Lambdaの構成にX-Rayを有効化

Last updated at Posted at 2023-01-19

はじめに

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テーブルにクエリし、返ってきたデータを返します。
image.png

・使用言語
Python(Lambdaでは3.9をランタイム環境として使用)

・開発環境
 OS:Windows
 Pythonバージョン:3.8.6

手順

DynamoDBテーブル作成

IDとユーザー名を持つテーブルを作成します。

DynamoDBのコンソール画面にて、「テーブルの作成」をクリック
スクリーンショット 2023-01-18 222343.png

テーブル名、パーティションキーを以下に設定し、他の設定はデフォルトでテーブルを作成
 テーブル名:testtable
 パーティションキー:ID(タイプ:数値)
スクリーンショット 2023-01-18 222533.png

作成したテーブルにレコード(DynamoDBでは項目と呼びます)を登録
テーブル画面で、アクション→項目を作成
image.png

「新しい属性の追加」ボタンをクリックし、username属性(タイプ:文字列)を追加します。
追加後、レコードを入力し、「項目を作成」をクリックします。
image.png

レコードが作成されたことを確認します。
「テーブルアイテムの探索」をクリックします。
image.png

返された項目欄に、登録したレコードが記録されていることを確認します。
image.png

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

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のコンソール画面に移動し、レイヤー→レイヤーの作成をクリックする。
image.png

以下項目を記載の通りに入力し、レイヤーを作成します。
名前:xray
説明:X-Ray実行コード(入れなくてもOK)
zipファイルをアップロードを選択し、↑でzip化したパッケージをアップロードします。
互換性のランタイム:Python 3.9
image.png

レイヤーコンソール画面に作成したレイヤーが表示されることを確認します。
image.png

Lambda関数作成

以下処理を実施するPythonコードをLambda関数として登録します。
 DynamoDBテーブルにクエリ
 クエリ結果をレスポンスに入れてreturn

Pythonコードの中身
 "import layer"でLayerにデプロイしたX-Ray実行コードを読み込みます。
  デプロイしたLambda Layerは、この後作成するLambda関数に紐づける必要があります。
  紐づけはLambda関数作成後に実施します。
 クエリIDは、テーブルに登録したレコードの値に設定します。

test.py
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コンソールにて、関数の作成をクリックする。
image.png

以下の内容でLambda関数を作成します。
関数名:test-xray
ランタイム:Python 3.9
 Layerと同じランタイムにする必要があります!
他はデフォルトのままでOK
image.png

Lambdaのコードをデプロイします。
↑記載のコードをLambda関数のコードに貼り付けます。
貼り付け後、「Deploy」をクリックします。
image.png

Lambda関数に紐づくIAMロールに、DynamoDBの読み取り権限を付与します。
(デフォルトで作られるIAMロールにはこの権限が付与されていないため)
作成したLambda関数の画面に移動します。
設定→アクセス権限→ロール名をクリックします。
image.png

許可→許可ポリシーの「許可を追加」→「ポリシーをアタッチ」をクリックします。
image.png

AmazonDynamoDBReadOnlyAccessポリシーを選択し、「ポリシーをアタッチ」をクリックします。
(検索フォームでDynamoと検索すると出てきます。)
image.png

ポリシーがアタッチされていることを確認します。
image.png

Lambda関数にX-Rayを有効化します。
Lambda関数画面の「設定」→「モニタリングおよび運用ツール」の「編集」をクリックします。
image.png

AWS X-Rayを有効化して保存します。
image.png

LambdaでX-Rayが実行されているか、コードを実行して確認します。
テストタブに移動し、以下内容でテストイベントを作成します。
 イベントアクションをテスト:新しいイベントを作成
 イベント名:test
他の設定はデフォルトのままで、「保存」をクリックします。
image.png

テストを実施します。
「テスト」ボタンをクリックします。
実行後、以下の結果が返ってくることを確認します。

{
  "statusCode": 200,
  "body": "Taro Tanaka"
}

image.png

AWS X-Rayが実行されているか確認します。
モニタリングタブに移動します。
Service Mapにて、下図のようにLambdaとDynamoDBが可視化されます。
image.png

さらに、Map下のIDをクリックすると、CloudWatchのX-Rayコンソール画面に移動し、詳細内容を確認できます。
image.png

CloudWatachのX-Rayコンソールの、セグメントのタイムライン欄で、DynamoDBへのクエリに要した時間が記録されていることが確認できます。
このように、X-Ray SDKを使うことで、Lambda関数内のAWSサービス呼び出しに要した時間も把握できます。
image.png

Lambda関数の設定は以上です。
次に、API Gatewayを作成します。

API Gatewayの作成

API Gatewayのコンソールに移動し、「APIを作成」をクリックします。
image.png

REST APIの「構築」をクリックします。
image.png

以下内容でREST APIを作成します。
 REST選択
 「新しいAPI」を選択
 API名:testxray
 エンドポイントタイプ:リージョン
image.png

APIが作成されると以下画面が表示されます。
image.png

API作成後、GETメソッドを作成します。
アクション→「メソッドの作成」をクリックします。
image.png

GETメソッドを選択します。
image.png

メソッド横のチェックボタン(下図赤枠)をクリックします。
image.png

以下内容で設定し、「保存」をクリックします。
 統合タイプ:Lambda関数
 Lambdaプロキシ統合の使用:チェックを入れる
 Lambdaリージョン:ap-northeast-1
 Lambda関数:test-xray
 デフォルトタイムアウトの使用:チェックを入れる
image.png

以下画面が表示されるのでOKをクリックします。
(Lambda関数ポリシーに、当該API Gatewayが関数を呼び出す権限を付与します)
image.png

これでAPI GatewayにLambda関数が紐づかれました。
image.png

Lambdaの画面に、API Gatewayが表示されていることも確認します。
(API GatewayとLambdaが紐づかれていることの確認です)
image.png

APIを実行できる状態にするために、API をデプロイします。
アクション→「APIのデプロイ」をクリックします。
image.png

以下の内容でデプロイします。
 デプロイされるステージ:新しいステージ
 ステージ名:任意
image.png

APIがデプロイされました。
image.png

デプロイされたAPIにX-Rayを有効化します。
ログ/トレースタブの、「X-Rayトレースの有効化」にチェックを入れ、「変更を保存」をクリックします。
image.png

有効化後、APIのURLにブラウザでアクセスします。
以下のように、DynamoDBのテーブルの値が返ってくることを確認します。
image.png

X-Rayのコンソールに移動します。
image.png

対象のAPI URLのログのIDをクリックします。
image.png

以下画面のように、DynamoDBへの呼び出しも可視化されていることがわかります。
image.png

API全体の所要時間に加えて、Lambda処理のトータル所要時間、Lambda内のDynamoDB呼び出しの所要時間が可視化されています。
image.png

まとめ

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

1
1
0

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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?