InstanaでサーバーレスのWebアプリケーション（AWS Lambda, API Gateway, DynamoDB）を監視する#1_エージェント導入と設定編

# はじめに
こんにちは。[Instana Observability Advent Calendar 2023](https://qiita.com/advent-calendar/2023/instana) 18日目を担当します、ふるかわです。何気に3回目の投稿となります。[前回](https://qiita.com/komuroki/items/6f5d992bf490d90bc6ce)、[前々回](https://qiita.com/komuroki/items/f55ff29ed5e75340b8e4)は、概念的な部分も多かったので、今回は手を動かしてやってみる系の記事にしました。

# 対象とする読者
Instanaを用いたサーバレスアプリケーションの監視に興味がある方

# ゴール
- Instanaを用いたサーバレスアプリケーションの監視を行うにあたり、どのような手順/設定が必要か理解する。
- Instanaでどのようなメトリクスが取れるか確認する。

# 今回の検証（概要）
### 概要
AWS環境にInstanaエージェントを導入し、必要なセットアップをした後、Serverlessアプリの監視を行います。本記事では、エージェントの導入方法とLambdaの監視に必要なセットアップ手順までを主に解説します。

- 検証1. AWS環境にエージェントを導入し、必要な設定を行う(本記事)
- 検証2. エージェント導入結果を確認する(本記事)
- 検証3. アプリケーション・パースペクティブを設定する(次回以降の記事)
- 検証4. TBD(次回以降の記事)

参考記事：
[InstanaでAWS Serverlessアプリを可視化しよう！Lambda編](https://qiita.com/LgmQue/items/a1e847b9198ffe33846f)
@LgmQue(Shu Adachi)さん

### アーキテクチャ
本検証のアーキテクチャ概要は以下の通りです。

![Screenshot 2024-01-05 at 17.34.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492942/3500797e-1610-bedc-0d9e-f5c9bb2a3bcd.png)

- Amplify：HTML、CSSなどの静的コンテンツのホストとして機能。CD（Continuous Delivery）の基盤としても利用。
- Amazon Cognito：ユーザー管理機能と認証機能を実装。
- Lambda と API Gateway：バックエンドAPIとして利用。
- DynamoDB ：データベースとして利用。

### Instanaの監視対象
AWS Lambda, API Gateway, DynamoDB

### 監視対象のアプリケーション
"Wild Rydes"というサーバレスWebアプリケーションです。一言で言うと、タクシー配車アプリのGoみたいな感じです。地図上で自分の現在地を指定し、ユニコーンを呼ぶと、ユニコーンがお迎えに来てくれるという、なんともかわいらしいアプリケーションです。

AWSさんの[こちら](https://aws.amazon.com/jp/getting-started/hands-on/build-serverless-web-app-lambda-apigateway-s3-dynamodb-cognito/)のハンズオンアセットを利用して構築しています。


![Screenshot 2023-12-18 at 15.41.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492942/63796d3f-adaa-387b-42a6-f123055d9c3b.png)

![Screenshot 2023-12-18 at 16.40.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492942/8169c374-94fe-d064-9e22-f1ba59aafb86.png)


## 検証1. AWS環境にエージェントを導入し、必要な設定を行う。
### 1. AWSエージェントを導入する。
1.ホストにAWSエージェントをインストールする
AWSエージェント導入方法については、[こちら](https://www.ibm.com/docs/ja/instana-observability/current?topic=iha-installing-host-agent-amazon-elastic-compute-cloud-amazon-ec2)を参考にしてください。

:::note info
AWSエージェントと言っているのは、EC2やECSに導入する[この](https://www.ibm.com/docs/ja/instana-observability/current?topic=agents-amazon-web-services-aws#installing-aws-agent)エージェントのことです。AWSエージェントはホスト・エージェントと呼ばれることもあります。2で出てくるサーバレス・エージェントとは全く別物です。
:::

:::note warn
Instanaにはエージェント、センサー、トレーサーという3つのコンポーネントがあります。エージェントとトレーサーは自分で監視対象側にインストールする必要があります。一方、センサーはエージェントさえ導入すれば、自動でセットアップされるため、手作業でのインストールは不要です。
:::

:::note warn
各種メトリクスやトレースデータはエージェントを介してバックエンドに送信されます。つまりエージェントがいないと何もデータを取ってこれません。
:::

2.エージェントの設定を行う。
エージェントのconfiguration.yamlを修正します。当該ファイルの場所は、Linuxであればfileコマンドで探してください。

viなどで当該ファイルを開き、監視したいサービスのプラグインのenabledフラグをtureに変更します。各フラグはコメントアウトされているので併せて外してください。以下のようなイメージです。今回はcloudwatch_pridodのコメントも外しました。こちらの設定値は今回はデフォルトのままとしています。

```configuration.yaml
#com.instana.plugin.aws.apigateway:
  enabled: true
  cloudwatch_period: 60
#  include_tags:
#  exclude_tags:
#  include_untagged: true

#com.instana.plugin.aws.dynamodb:
  enabled: true
  cloudwatch_period: 300
#  include_tags:
#  exclude_tags:
#  include_untagged: true

#com.instana.plugin.aws.lambda:
  enabled: true
  cloudwatch_period: 300
  # include_tags:
  # exclude_tags:
  
#com.instana.plugin.aws.ec2:
  enabled: true
  tags-poll-rate: 30
```


### 2.サーバレス・エージェント（Lambdaトレーサー）を導入する。

:::note warn
「サーバレス・エージェントを導入する」と記載していますが、厳密には、サーバーレス環境を監視するためのInstanaセンサーを構成することを指しています。このセンサーを構成するには、InstanaのLambdaトレーサーをAWS Lambda関数にインストールする必要があります。
:::
1. サーバレス・エージェント（Lambdaトレーサー）インストールに必要なスクリプトを用意する。
1-1. Instana UIの左のメニューバーから「その他」＞「エージェント」を選択。
    ![Screenshot 2023-12-18 at 10.17.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492942/9f7bfeb2-4810-75b2-911e-e35321558aef.png)  

    1-2. 遷移先の画面で「エージェントのインストール」を選択。
    ![Screenshot 2023-12-18 at 10.20.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492942/adc2761c-8dc8-c750-1f54-012b4cb7ca48.png)

    1-3. 「AWS Lambda」を選択。Lambdaランタイムを選択。AWSのGUIでもCLIでもトレーサーのインストールは可能ですが、今回はCLIでやってみます。
    ![Screenshot 2023-12-18 at 10.22.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492942/074c1b3c-1804-4243-c1df-b27ff8bed0cc.png)

    1-4. 同画面で提供されているトレーサーのインストールに必要なシェルスクリプトをエディタなどにコピーし、＜＞の箇所を任意の値に置き換えて、保存。

    ```install_lambda_tracer_for_lambda.sh
    #!/bin/bash
    aws --region <YOUR_AWS_RESION> lambda update-function-configuration \
        --function-name <YOUR_FUNCTION_NAME> \
        --layers ＜YOUR_LAMBDA_LAYER_ARN＞ \
        --handler instana-aws-lambda-auto-wrap.handler \
        --environment "Variables={INSTANA_ENDPOINT_URL=
        <YOUR_INSTANA_ENDPOINT_URL>, INSTANA_AGENT_KEY=<YOUR_INSTANA_AGENT_KEY> }"```

:::note info
ここで簡単にAWSコマンドの解説をしておきます。不要な方は読み飛ばしてください。
```
$ aws --region ap-northeast-1 lambda update-function-configuration
      --function-name <YOUR_FUNCTION_NAME>
```
東京リージョン（ap-northeast-1）にデプロイされたLambdaの設定をアップデートする、という意味のコマンド。`YOUR_FUNCTION_NAME` で指定したLambda関数の設定を更新するという意味。

```
$aws --layers ＜YOUR_LAMBDA_LAYER_ARN＞
```
Lambda関数にレイヤーを追加するコマンド。＜YOUR_LAMBDA_LAYER_ARN＞でレイヤーのARN（Amazon Resource Name）を指定している。

```
$aws --handler instana-aws-lambda-auto-wrap.handler:
```
Lambda関数のハンドラーを指定するコマンド。ハンドラーはLambda関数のエントリーポイント。この例では、instana-aws-lambda-auto-wrap.handlerをハンドラーとして設定している。

```
$aws --environment "Variables={INSTANA_ENDPOINT_URL=<YOUR_INSTANA_ENDPOINT_URL>, INSTANA_AGENT_KEY=<YOUR_INSTANA_AGENT_KEY> }"
```
Lambdaの環境変数を設定するコマンド。INSTANA_ENDPOINT_URLとINSTANA_AGENT_KEYには、
以下キャプチャの赤枠箇所からコピーした値を埋め込んでください。
![Screenshot 2024-01-05 at 21.34.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492942/d393cb41-af15-5240-a033-bc545217a6f9.png)
:::

2.スクリプトを実行する
2-1. ひとつ前の手順で用意したスクリプトの実行に必要なIAMポリシーをIAMユーザに割り当てる。例えば、lambda:UpdateFunctionConfiguration などのポリシーが必要です。

:::note warn
スクリプト実行時、他にもpermission denied系のエラーが出るかもしれません。エラー内容を見ながらご自身の環境に応じた適切な権限をアタッチして、スクリプトを実行してください。
:::

2-2. AWSコンソールでIAMを開き、任意のIAMユーザを選択。今回は監視対象のアプリを構築するときに使ったIAMユーザを使用。
    ![Screenshot 2023-12-18 at 19.36.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492942/97ca101e-eba6-87b9-18dd-1402523bc6cb.png)

2-3.「Permissions」タブを追加。プルダウンから「Create inline policy」を選択。
![Screenshot 2023-12-18 at 19.37.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492942/13874202-3d0d-3b1a-c939-8c2afcbb8586.png)

2-4.遷移先の画面で「JSON」のメニューを選択。既存のポリシーを以下のポリシーで上書きする。その後、画面左下「next」を選択。

![Screenshot 2023-12-18 at 19.43.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492942/47783734-943c-28ad-bc6a-fe76dcd80577.png)


```IAM_Policy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "lambda:UpdateFunctionConfiguration",
        "lambda:GetLayerVersion"
      ],
      "Resource": "*"
    }
  ]
}
```

2-5.任意のポリシー名を付け、「Create Policy」をクリック。
![Screenshot 2023-12-18 at 19.46.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492942/548fd7fa-1604-4322-a819-8eb4bff6b001.png)

2-6.先ほど作成したポリシーがIAMユーザにアタッチされていることを確認。
![Screenshot 2023-12-18 at 19.47.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492942/1ee2e928-0f31-37e8-d18f-233d7106e887.png)

これで、IAMユーザに適切な権限を持つポリシーを付与することができました。これでスクリプト実行の準備完了です。

2-7.いざスクリプトを実行。実行結果はこんな感じ。
```json
{
    "FunctionName": "<YOUR_LAMBDA_FUNCTION_NAME>",
    "FunctionArn": "<YOUR_LAMBDA_FUNCTION_ARN>",
    "Runtime": "nodejs16.x",
    "Role": "arn:aws:iam::<YOUR-AWS-ACCOUNT-ID>:role/<IAM-ROLE-NAME>",
    "Role": "arn:aws:iam::<YOUR-AWS-ACCOUNT-ID>:role/<IAM-ROLE-NAME>",
    "LastModified": "2023-12-18T12:33:17.000+0000",

     ~ 略 ~
    
    "Layers": [
        {
            "Arn": "＜YOUR_LAMBDA_LAYER_ARN＞",
        }
    ],
    "State": "Active",
     ~ 略 ~
}
```

以上で、AWSエージェントとサーバレス・エージェント（Lambdaトレーサー）の導入、各種セットアップが完了しました。では、AWSの各種サービスがInstanaで検知されているか確認してみます。

## 検証2. エージェント導入結果を確認する
AWSエージェントが正常に稼働していることがわかります。
![Screenshot 2024-01-05 at 21.10.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492942/fcb344c5-99d2-b488-2260-072ffc22faf4.png)

今回は直接関係ありませんが、Instanaのインフラストラクチャーモニタリング機能で、無事、EC2が検出されています。
![Screenshot 2024-01-05 at 23.21.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492942/5814188d-b57a-7453-0566-af466aa09731.png)


また、アプリケーションモニタリング機能のサービスとしてLambdaが検出されていることがわかります。
![Screenshot 2024-01-05 at 21.05.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492942/b67f3bb5-aa87-1e6f-0725-2517d0116c1a.png)

DynamoDBも無事、検出されました。
![Screenshot 2024-01-05 at 21.11.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492942/3ca964fc-4aa4-62d3-cfe4-0b6aa668c88e.png)


# おわりに
これでエージェント導入とセットアップは完了です！
次回はプリケーションモニタリングに必要なアプリケーション・パースペクティブを設定してみます。


# 改版履歴
2024/01/05　以下、追記、修正を実施。 
- AWSエージェントをインストールする手順を追記。
- AWSエージェントとサーバレスエージェント（Lambdaトレーサー）の違いを明記。
- アーキテクチャー図更新（エージェンントとトレーサー、センサーを明示）