はじめに
こんにちは。Instana Observability Advent Calendar 2023 18日目を担当します、ふるかわです。何気に3回目の投稿となります。前回、前々回は、概念的な部分も多かったので、今回は手を動かしてやってみる系の記事にしました。
対象とする読者
Instanaを用いたサーバレスアプリケーションの監視に興味がある方
ゴール
- Instanaを用いたサーバレスアプリケーションの監視を行うにあたり、どのような手順/設定が必要か理解する。
- Instanaでどのようなメトリクスが取れるか確認する。
今回の検証(概要)
概要
AWS環境にInstanaエージェントを導入し、必要なセットアップをした後、Serverlessアプリの監視を行います。本記事では、エージェントの導入方法とLambdaの監視に必要なセットアップ手順までを主に解説します。
- 検証1. AWS環境にエージェントを導入し、必要な設定を行う(本記事)
- 検証2. エージェント導入結果を確認する(本記事)
- 検証3. アプリケーション・パースペクティブを設定する(次回以降の記事)
- 検証4. TBD(次回以降の記事)
参考記事:
InstanaでAWS Serverlessアプリを可視化しよう!Lambda編
@LgmQue(Shu Adachi)さん
アーキテクチャ
本検証のアーキテクチャ概要は以下の通りです。
- Amplify:HTML、CSSなどの静的コンテンツのホストとして機能。CD(Continuous Delivery)の基盤としても利用。
- Amazon Cognito:ユーザー管理機能と認証機能を実装。
- Lambda と API Gateway:バックエンドAPIとして利用。
- DynamoDB :データベースとして利用。
Instanaの監視対象
AWS Lambda, API Gateway, DynamoDB
監視対象のアプリケーション
"Wild Rydes"というサーバレスWebアプリケーションです。一言で言うと、タクシー配車アプリのGoみたいな感じです。地図上で自分の現在地を指定し、ユニコーンを呼ぶと、ユニコーンがお迎えに来てくれるという、なんともかわいらしいアプリケーションです。
AWSさんのこちらのハンズオンアセットを利用して構築しています。
検証1. AWS環境にエージェントを導入し、必要な設定を行う。
1. AWSエージェントを導入する。
1.ホストにAWSエージェントをインストールする
AWSエージェント導入方法については、こちらを参考にしてください。
AWSエージェントと言っているのは、EC2やECSに導入するこのエージェントのことです。AWSエージェントはホスト・エージェントと呼ばれることもあります。2で出てくるサーバレス・エージェントとは全く別物です。
Instanaにはエージェント、センサー、トレーサーという3つのコンポーネントがあります。エージェントとトレーサーは自分で監視対象側にインストールする必要があります。一方、センサーはエージェントさえ導入すれば、自動でセットアップされるため、手作業でのインストールは不要です。
各種メトリクスやトレースデータはエージェントを介してバックエンドに送信されます。つまりエージェントがいないと何もデータを取ってこれません。
2.エージェントの設定を行う。
エージェントのconfiguration.yamlを修正します。当該ファイルの場所は、Linuxであればfileコマンドで探してください。
viなどで当該ファイルを開き、監視したいサービスのプラグインのenabledフラグをtureに変更します。各フラグはコメントアウトされているので併せて外してください。以下のようなイメージです。今回はcloudwatch_pridodのコメントも外しました。こちらの設定値は今回はデフォルトのままとしています。
#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トレーサー)を導入する。
「サーバレス・エージェントを導入する」と記載していますが、厳密には、サーバーレス環境を監視するためのInstanaセンサーを構成することを指しています。このセンサーを構成するには、InstanaのLambdaトレーサーをAWS Lambda関数にインストールする必要があります。
-
サーバレス・エージェント(Lambdaトレーサー)インストールに必要なスクリプトを用意する。
1-1. Instana UIの左のメニューバーから「その他」>「エージェント」を選択。
1-2. 遷移先の画面で「エージェントのインストール」を選択。
1-3. 「AWS Lambda」を選択。Lambdaランタイムを選択。AWSのGUIでもCLIでもトレーサーのインストールは可能ですが、今回はCLIでやってみます。
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> }"```
ここで簡単に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には、
以下キャプチャの赤枠箇所からコピーした値を埋め込んでください。
2.スクリプトを実行する
2-1. ひとつ前の手順で用意したスクリプトの実行に必要なIAMポリシーをIAMユーザに割り当てる。例えば、lambda:UpdateFunctionConfiguration などのポリシーが必要です。
スクリプト実行時、他にもpermission denied系のエラーが出るかもしれません。エラー内容を見ながらご自身の環境に応じた適切な権限をアタッチして、スクリプトを実行してください。
2-2. AWSコンソールでIAMを開き、任意のIAMユーザを選択。今回は監視対象のアプリを構築するときに使ったIAMユーザを使用。
2-3.「Permissions」タブを追加。プルダウンから「Create inline policy」を選択。
2-4.遷移先の画面で「JSON」のメニューを選択。既存のポリシーを以下のポリシーで上書きする。その後、画面左下「next」を選択。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"lambda:UpdateFunctionConfiguration",
"lambda:GetLayerVersion"
],
"Resource": "*"
}
]
}
2-5.任意のポリシー名を付け、「Create Policy」をクリック。
2-6.先ほど作成したポリシーがIAMユーザにアタッチされていることを確認。
これで、IAMユーザに適切な権限を持つポリシーを付与することができました。これでスクリプト実行の準備完了です。
2-7.いざスクリプトを実行。実行結果はこんな感じ。
{
"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. エージェント導入結果を確認する
今回は直接関係ありませんが、Instanaのインフラストラクチャーモニタリング機能で、無事、EC2が検出されています。
また、アプリケーションモニタリング機能のサービスとしてLambdaが検出されていることがわかります。
おわりに
これでエージェント導入とセットアップは完了です!
次回はプリケーションモニタリングに必要なアプリケーション・パースペクティブを設定してみます。
改版履歴
2024/01/05 以下、追記、修正を実施。
- AWSエージェントをインストールする手順を追記。
- AWSエージェントとサーバレスエージェント(Lambdaトレーサー)の違いを明記。
- アーキテクチャー図更新(エージェンントとトレーサー、センサーを明示)