InstanaでAWS Serverlessアプリを可視化しよう！Lambda編

# はじめに

本記事は、下記動画の手順を書き起こしたものです。
実際に動く画面を確認したい方はぜひご視聴ください。
今回利用している言語はPythonです、その他言語については[公式ドキュメント](https://www.ibm.com/docs/ja/instana-observability/current?topic=agents-aws-lambda-agent#installing-instana-lambda-tracers-in-aws-lambda-functions)を参照の上、適宜読み替えてお試しください。

https://video.ibm.com/recorded/132859917

Instanaは14日間のFree Trialが可能です。
Try Instana! > https://www.instana.com/trial/

# 検証用Lambdaの作成

AWS Lambdaのダッシュボードを開き、**関数の作成** をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118463/76855990-8a44-23bf-0bb0-53b97b7f1ba8.png)

任意の関数名を入力し、ランタイムは **Python 3.9** を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118463/a15f29fe-6dee-5397-dc6f-d9615e1aadda.png)
> 動画撮影時点ではPython3.9までのサポートだったため。
> Pythonの最新サポート状況は下記URLにてご確認ください。
> https://www.ibm.com/docs/ja/instana-observability/current?topic=lambda-aws-native-tracing-python

詳細設定にて **関数URLを有効化** をONにし、認証タイプは **NONE**(デモ用に簡略化していますが、IAMでの認証を指定しても問題ありません) を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118463/b716182d-91ea-3c4a-8636-e97151f93974.png)

画面を下までスクロールし、**関数の作成** をクリックします。

Lambdaが作成できたら関数URLのURLをクリックし **Hello from Lambda!** と表示されたらLambdaの動作確認完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118463/a927fd84-0348-3569-0e65-9d7aa15d8a95.png)

参考：Chromeで試した場合の画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118463/1850ee16-48a1-60bf-794e-43dea382c5e5.png)

# AWS Lambdaへの追加設定

Lambdaに設定する情報をInstanaのWebコンソールから入手します。
画面左の[•••] > [More] > [Agents] と進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118463/e47dd9db-3769-7b09-775f-c52e079af53b.png)

エージェント画面が表示されたら **Installing Instana Agents** をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118463/a7aba311-fd13-4769-c6ef-dc2ce4af180a.png)

PLATFORMで **AWS** を選択し、Technologyで **AWS Lambda** を選択します。
Lambda runtimeは **Python 2.7 and 3.x** を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118463/8f5a62a3-a40c-9a7b-a7b2-6ef425b5fc5c.png)

AWS Web Consoleセクションまでスクロールし、AWSのリージョンを指定します。
今回は東京リージョンにLambdaを作成したので **ap-northeast-1** に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118463/b9a2d907-441a-4076-558d-0408cf1c7cdc.png)

これで設定に必要な情報は準備できました。
以降の手順でこの画面の表示内容を使用しますので、このままページを開いておいてください。

## 1. レイヤーの設定

Instanaの画面でARNの文字列をコピー(右上のCopyの文字をクリック)します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118463/0b7d7255-b307-3614-4bdb-4769ec0f1db4.png)

Lambdaの画面に戻り、コードタブの下までスクロールし **レイヤーの追加** をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118463/5a4faf14-d360-c37a-d8f1-85020d771609.png)

レイヤー選択画面で **ARNを指定** を選択し、テキストボックスに先ほどInstanaの画面でコピーしたARNの文字列を貼り付け **検証** をクリックします。
正しいARNを指定している場合、画像の様に説明などが表示されます。
問題なければ **追加** をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118463/ded96a39-4069-ea8e-1d07-f40d39b2f510.png)

## 2. ランタイムの設定

Instanaの画面でHandlerの文字列をコピー(右上のCopyの文字をクリック)します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118463/e7a81d9f-dc47-c8eb-d229-772b68613505.png)

AWSの画面に戻り、コードタブの下までスクロールし **編集** をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118463/b4d7e357-b63d-5d4e-9596-79ed4d53c213.png)

ハンドラの値を先ほどInstanaの画面でコピーした値で上書きし、下までスクロールし **保存** をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118463/81befa50-8155-2831-6b15-d2dad9274d88.png)

## 3. 環境変数の設定

AWSの画面で[設定タブ] > [環境変数]へ移動し **編集** をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118463/12ae48fb-3723-4c1b-bfe8-221b73abac0a.png)

**環境変数の追加** を2回クリックし、入力欄を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118463/4d290626-d14b-bc6e-2aec-b534ecd3c25a.png)

それぞれのキーと値を入力し **保存** をクリックします。
Qiitaにもキー名は記載しますが、Instana側の画面にも表示されているのでそちらをコピーすると間違いなく確実です。

|キー|値|
|:-|:-|
|INSTANA_ENDPOINT_URL|Instanaの画面でコピー|
|INSTANA_AGENT_KEY|Instanaの画面でコピー|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118463/a9ad4daf-3c83-0fd2-30af-461ed2e544c2.png)

以上でLambda側への設定は完了です。

# 動作確認

InstanaでLambdaの情報が取得できているか確認します。

Instanaの画面左上のアイコンをクリックし、Applicationsを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118463/a39c05ea-e783-4dc0-e27b-43f03a28a58d.png)

作成したLambdaの名前の明細が表示されるまで少し待ちます。
連携しているアプリケーションが多い場合は見つけるのが大変なので、右上の絞り込みにて **AWS Lambda** を選択するなどしてください。
表示がされたら、名前をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118463/b49e8054-9684-f0da-2877-b003c9dd3ba4.png)

Lambda側の設定が完了してから一度も実行していないのでまだ何も表示されていません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118463/934013d2-1778-c7e3-b37a-b3c20b9f1ec6.png)

## エラー発生時

AWSの画面に戻り、コードタブにてソースコードを変更し意図的にエラーを発生させInstanaで確認してみます。
既存のソースコードの5行目に`raise SyntaxError`を追加し **Deploy** をクリックします。

```diff_python:sample
import json

def lambda_handler(event, context):
    # TODO implement
+   raise SyntaxError
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118463/13d4451f-178b-d980-616e-deca9ad9ed55.png)

Deployが完了したら再度関数URLから実行してみると、この様にエラーが発生していることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118463/d5b63fc0-b51a-9af1-ef47-c9da101214f3.png)

Instanaの画面に戻り 画面をリロード もしくは (見切れていますが)右上のLiveをクリック してデータが表示されるのを待ちます。
少しすると以下の様にエラーの呼び出しがあったことを示す棒グラフが表示されます。
バーにマウスを持っていくと詳細が表示されます。
画像では、「呼び出しが1回あり、そのうち1回がエラーが発生した」ことがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118463/fc4c27c7-2c44-c65e-8b62-a88de0c88c23.png)

無事にエラー発生時の動作を確認することができたので、正常時の動作も確認してみます。

## 正常時

AWSの画面に戻り、ソースコードを再度変更し先ほど仕込んだエラーをコメントアウトします。
既存のソースコードの5行目の先頭に`#`を追加し **Deploy** をクリックします。

```diff_python:sample
import json

def lambda_handler(event, context):
    # TODO implement
-   raise SyntaxError
+   # raise SyntaxError
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118463/0612bfd8-8388-d667-331b-0dc03dea2c27.png)

Deployが完了したら何度か関数の呼び出しを行ってInstana側に反映されるのを待ちましょう。
少しすると画像の様に青いバーが表示されます。
200系のHTTPステータスコードが返ってきているのでエラーにはカウントされていないことがこの画面で確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118463/a7994ff7-576e-0bf8-8dda-d298c92935e9.png)

正常系の動作確認もできましたので、手順は以上となります。

# まとめ

すでにAWS Lambdaをお持ちの場合は、設定項目は以下の3点のみとなります。(ちょー簡単！)
(AWS側)レイヤーの設定
(AWS側)ランタイムの設定
(AWS側)環境変数の設定

# 参考

- 公式ドキュメント
  https://www.ibm.com/docs/ja/instana-observability/current?topic=lambda-aws-native-tracing-python#installation