Django で始める AWS X-Ray

# はじめに

この記事は [ハンズラボ Advent Calendar 2020](https://qiita.com/advent-calendar/2020/handslab) 13日目の記事です。

Lambdaで実行計測を取りたくて始めたX-Rayでしたが、Djangoも出来そうだったので試してみました。

## 確認環境

- macOS
- python 3.7.8
- Django 3.1.4

## AWS X-Ray デーモン

ローカルから実行するためにデーモンを公式からダウンロードします。

以下からOS X (実行可能ファイル)をダウンロードしてください。
https://docs.aws.amazon.com/ja_jp/xray/latest/devguide/xray-daemon.html

ZIPファイルがダウンロードされるので任意の場所に解凍してください。

https://docs.aws.amazon.com/ja_jp/xray/latest/devguide/xray-daemon-local.html

```bash
# 解凍後作業ディレクトリを移動
cd ~/Downloads/aws-xray-daemon-macos-3.x
# 起動
./xray_mac -o -n ap-northeast-1
```

## X-Ray IAM 作成

AWS管理コンソールから以下のAWS管理ポリシーを持つ、IAMユーザーを作成して認証情報を取得してください。

- AWSXrayWriteOnlyAccess

## X-Ray プロファイル設定

取得した認証情報でデフォルトプロファイルを設定してください。

```text:~/.aws/config
[default]
region = ap-northeast-1
output = json
```

```text:~/.aws/credentials
[default]
aws_access_key_id = xxxxx
aws_secret_access_key = yyyyy
```

## Django のセットアップ

```bash
# 作業ディレクトリ作成(任意)
mkdir ~/LocalProjects/django-xray

# 仮想環境の作成
python -m venv ~/envs/django-xray

# アクティベート
source ~/envs/django-xray/bin/activate

# バージョン
python --version
Python 3.7.8

# Django インストール
pip install Django
# x-ray インストール
pip install aws-xray-sdk

# Django バージョン
python -m django --version
3.1.4

# 作業ディレクトリ移動
cd ~/LocalProjects/django-xray

# Django プロジェクト新規作成
django-admin startproject mysite

# テストDB作成
./manage.py migrate

# テストユーザー作成
./manage.py createsuperuser
Username (leave blank to use 'daisuke-araki'): (任意)
Email address: (未入力)
Password: (任意)
Password (again): (任意)
Superuser created successfully.
```

## Django の設定

X-Rayを使えるようにするために設定を変更します。
https://docs.aws.amazon.com/ja_jp/xray/latest/devguide/xray-sdk-python-configuration.html

### AWS X-Ray ミドルウェアを追加する

１行目を追加します。

```python:/mysite/settings.config
MIDDLEWARE = [
    'aws_xray_sdk.ext.django.middleware.XRayMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
```

```python
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'aws_xray_sdk.ext.django',
]
```

```python
XRAY_RECORDER = {
    'AUTO_INSTRUMENT': True,
    'AWS_XRAY_CONTEXT_MISSING': 'LOG_ERROR',
    'AWS_XRAY_DAEMON_ADDRESS': '127.0.0.1:2000',
    'AWS_XRAY_TRACING_NAME': 'My application',
    'SAMPLING': False,
}
```

## 動作確認

```bash
# Django の起動
./manage.py runserver 18080
```

### ブラウザからDjango管理画面を開く

Safari で確認しました。

- `http://localhost:18080/admin/` を開く。
- 先程作成したユーザーでログインします。
- ユーザーを新規追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228453/1be2f935-a295-eb5d-4dba-faea2ade3077.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228453/0081254a-4128-773b-145c-a54213a59e40.png)

### 結果の確認

AWS管理コンソールから X-Rayの状態を確認します。
Djangoのリクエストが自動計測されていることが確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228453/5caaeb0a-4127-c33e-0de9-526a729c8e3b.png)