Amazon EC2へのInstanaエージェント導入&セットアップ

# はじめに
IBM Instana Observability（以下、Instana）は、アプリケーションパフォーマンス管理（**A**pplication **P**erformance **M**anagement | APM）を実現する監視ソフトウェア/SaaSです。

Instanaを利用するには、監視対象のアプリケーションがデプロイされているホストに
エージェントを導入する必要があります。今回は、Amazon EC2にエージェントを導入する方法をまとめます。
(2024/2/21時点)

公式ドキュメントはこちらです。併せてご確認ください。
https://www.ibm.com/docs/ja/instana-observability/current?topic=agents-amazon-web-services-aws

# Amazon EC2にInstanaエージェントを導入する
## 1. エージェント導入先のEC2インスタンスを構築する
1. AWSコンソールにログインし、検索ボックスで"EC2"と入力/検索し、EC2の画面を開きます。
2. "Launch Instnace"というオレンジのボタンをクリックします。
![Screenshot 2023-12-19 at 16.13.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492942/ebb2a3e2-f02d-4c56-2637-96b90c0f7ac8.png)

3. 遷移後の画面で任意のInstnace名を入力します。
![Screenshot 2023-12-19 at 16.14.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492942/27e2c96c-ad24-5c22-17fd-bded9aafa835.png)

4. OSを選択します。エージェントのシステム要件の詳細は[こちら](https://www.ibm.com/docs/ja/instana-observability/current?topic=agents-amazon-web-services-aws)をご覧ください。今回は、Amazon Linux、CPUアーキテクチャは64-bit(x86)を利用します。
![Screenshot 2023-12-19 at 16.16.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492942/2b1b7f22-8c50-b283-faed-1a3c5c8aed5a.png)

5. インスタンスタイプを選択します。今回のインスタンスは、エージェント導入先としてのみ利用するので、安価なt2.microにします。
![Screenshot 2023-12-19 at 16.18.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492942/c035e033-c3af-dba4-5109-95defbba6854.png)

6. Network settings 、Configure storage はデフォルトのままでOKです。（もちろん必要があれば設定してください。）

7. キーペアを作成します。インスタンスにSSH接続するときに必要です。後続の手順で、EC2にSSH接続して、エージェントのconfiguration.yamlを編集するという作業があるので、ここで設定しちゃいましょう。（既に既存のものがあれば、新規作成は不要で、既存のものを流用していただいて構いません。）
![Screenshot 2023-12-19 at 16.21.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492942/7b26cf70-e41f-caaa-5eb1-6418ec9840b2.png)

8. 画面を下にスクロールし、Advanced detailsを開き、ユーザーデータに指定のワンライナーを入力します。ワンライナーの取得方法は次の手順で説明します。
![Screenshot 2024-01-06 at 15.41.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492942/0295bf15-26d9-84ec-c7ca-c7f8ee2672fa.png)
:::note info
ユーザーデータはEC2起動時に実行されるスクリプトのことです。
:::
9.ワンライナーを取得します。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)  
    10. 遷移先の画面で「エージェントのインストール」>AWSを選択します。
    ![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)
    11. 「テクノロジー」のプルダウンから、「Elastic Computing (EC2) - Linux」 を選択。パッケージは「動的」、ランタイムは「Azul Zulu 1.8」(デフォルトのままま)とします。必要な項目を選択/入力していくと、エージェントインストールに必要なワンライナーが表示されます。これをコピーして、手順8のユーザーデータの欄に貼り付け、「Save」をクリックします。  
    ![Screenshot 2023-12-19 at 16.33.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492942/cb58ca51-3945-ed4c-769d-664bee064283.png)
    12. EC2の設定及びエージェントインストールの準備が整いました。EC2を作成します。  
    EC2の画面を一番下までスクロールして、「Launch Instances」をクリックします。    
    13. AWSマネジメントコンソール>左メニュー>EC2 dashboard>Instanaces（runnnig）より、インスタンスが作成されたことを確認します。Instance stateが「Running」になっていればOKです。
    ![Screenshot 2023-12-19 at 16.26.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492942/69d41d53-2940-4b24-47ae-f4a2e079ae9b.png)

## 2. IAMポリシーを作成する
Instanaエージェントは、各センサーからデータを収集し、バックエンド側に送信する仕組みです。

- エージェント：ホストに導入するコンポーネント。AWS環境であれば、EC2などに導入し、VMware環境であれば、vSphere上の仮想マシンに導入します。
- センサー：様々なAWSサービスやミドルウェアなどからデータを収集するコンポーネントです。

:::note info
Instanaのセンサーについて
https://www.ibm.com/docs/ja/instana-observability/256?topic=requirements-instana-sensor
:::


エージェントは手動でのインストール作業が必要ですが、エージェントさえ導入してしまえば、センサーは自動的に構成されるので、センサーのインストール作業は不要です。

エージェントが、各センサーからデータを収集できるようにするために、
EC2に指定のIAMロールを付与する必要があります。
では、IAMロール付与の手順を見ていきます。

IAMロールの設定方法はAWSマネジメントコンソール or CLI利用の2種類がありますが、
今回はCLIでやってみます。

1. ポリシードキュメントファイルの作成:
IAMポリシーの元となるファイルを作成します。以下jsonをファイルとして保存してください。公式docsに合わせて、ファイル名は「configuration.json」とします。このポリシーは、Instanaが監視できるAWSサービス全てを網羅しているので、一度このポリシーを作ってしまえば、あとは修正等は不要です。

https://www.ibm.com/docs/ja/instana-observability/256?topic=agent-amazon-web-services-iam-configuration

```configuration.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "apigateway:GET",
        "elasticbeanstalk:DescribeEnvironments",
        "elasticbeanstalk:ListTagsForResource",
        "elasticbeanstalk:DescribeInstancesHealth",
        "cloudfront:GetDistribution",
        "cloudfront:ListDistributions",
        "cloudfront:ListTagsForResource",
        "dynamodb:ListTables",
        "dynamodb:DescribeTable",
        "dynamodb:ListTagsOfResource",
        "rds:DescribeDBInstances",
        "rds:DescribeEvents",
        "rds:ListTagsForResource",
        "sqs:ListQueues",
        "sqs:GetQueueAttributes",
        "sqs:ListQueueTags",
        "elasticache:ListTagsForResource",
        "elasticache:DescribeCacheClusters",
        "elasticache:DescribeEvents",
        "elasticloadbalancing:DescribeLoadBalancers",
        "elasticloadbalancing:DescribeTags",
        "elasticmapreduce:ListClusters",
        "elasticmapreduce:DescribeCluster",
        "es:ListDomainNames",
        "es:DescribeElasticsearchDomain",
        "es:ListTags",
        "ec2:DescribeInstances",
        "ec2:DescribeTags",
        "ec2:DescribeVolumes",
        "kafka:ListClusters",
        "kafka:ListNodes",
        "kafka:ListTagsForResource",
        "kafka:DescribeCluster",
        "kinesis:ListStreams",
        "kinesis:DescribeStream",
        "kinesis:ListTagsForStream",
        "lambda:ListTags",
        "lambda:ListFunctions",
        "lambda:ListEventSourceMappings",
        "lambda:GetFunctionConfiguration",
        "lambda:ListVersionsByFunction",
        "mq:ListBrokers",
        "mq:DescribeBroker",
        "s3:GetBucketTagging",
        "s3:ListAllMyBuckets",
        "s3:GetBucketLocation",
        "s3:GetBucketPolicyStatus",
        "xray:BatchGetTraces",
        "xray:GetTraceSummaries",
        "tag:GetResources"
      ],
      "Effect": "Allow",
      "Resource": "*"
    },
    {
      "Action": [
        "cloudwatch:GetMetricStatistics",
        "cloudwatch:GetMetricData",
        "cloudwatch:ListMetrics"
      ],
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}
```
2.AWS CLIを使用してポリシーを作成します。
先ほどのファイルを利用して、CLIを介して新しいIAMポリシーを作成します。以下のコマンドを実行してください。（your-policy-name は適切なポリシー名に置き換えてください）:

```
$ aws iam create-policy --policy-name your-policy-name --policy-document file://configuration.json
```

実行結果
```
{
    "Policy": {
        "PolicyName": "your-policy-name",
        "PolicyId": "xxxxxxxxxxxxx",
        "Arn": "arn:aws:iam::xxxxxxxxxxxxxxxxxxxxx",
        "Path": "/",
        "DefaultVersionId": "v1",
        "AttachmentCount": 0,
        "PermissionsBoundaryUsageCount": 0,
        "IsAttachable": true,
        "CreateDate": "2023-12-19T10:21:05+00:00",
        "UpdateDate": "2023-12-19T10:21:05+00:00"
    }
}
```

## 3. IAMロールを作成する
1. IAMロールを作成します。今回はロール名は、EC2_discover_instana_sensor としました。また、EC2に対してAssumeRoleする必要があるので、以下のtrust-policy.jsonというファイルを作成/利用して、ロールに信頼ポリシーをアタッチしてください。

```
$ aws iam create-role --role-name EC2_discover_instana_sensor --assume-role-policy-document file://trust-policy.json
```
trust-policy.json はEC2インスタンスがこのロールを引き受けることを許可する信頼ポリシードキュメントを含むファイルです。ファイルの内容は以下の通りです。

```trust-policy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```
コマンドの実行結果は以下です。

```json
{
    "Role": {
        "Path": "/",
        "RoleName": "EC2_discover_instana_sensor",
        "RoleId": "xxxxxxxxxxxxxxxxx",
        "Arn": "arn:aws:iam::xxxxxxxxxxxx:role/EC2_discover_instana_sensor",
        "CreateDate": "2023-12-19T10:30:58+00:00",
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Principal": {
                        "Service": "ec2.amazonaws.com"
                    },
                    "Action": "sts:AssumeRole"
                }
            ]
        }
    }
}
```

## 4. IAMポリシーをIAMロールにアタッチする。
手順2で作成したポリシーを手順3で作成したロールにアタッチします。以下のコマンドを実行します。
```
$aws iam attach-role-policy --role-name your-role-name --policy-arn your-policy-arn
```
your-policy-arn は先ほど作成したIAMポリシーのARNに置き換えてください。

実行結果は特に何も出力されないので、以下のコマンドを実行して、ポリシーがロールにアタッチされたかを確認します。以下、実行結果の”RoleName”に自分が作成したロールの名前が入っていればOKです。

```
$ aws iam list-entities-for-policy --policy-arn "your-polisy-arn" 
```

実行結果

```json
{
    "PolicyGroups": [],
    "PolicyUsers": [],
    "PolicyRoles": [
        {
            "RoleName": "EC2_discover_instana_sensor",
            "RoleId": "xxxxxxxxxxxxxxxxxx"
        }
    ]
}

```
## 5. IAMロールをEC2インスタンスにアタッチ
前提：インスタンスプロファイルが必要になるため、予め作成しておきます。

1. インスタンスプロファイルを作成します。
後続の2の手順でインスタンスプロファイルが必要になるので、予めプロファイルの情報を確認してください。ない場合は、作成してください。

1-1.プロファイルの有無を確認します。
```
aws ec2 describe-instances --instance-ids your-instana-id --query 'Reservations[*].Instances[*].IamInstanceProfile'
```
これはプロファイルがない場合の実行結果です。

```実行結果
[
    []
]
```
プロファイルがなければ、以下のコマンドで作成してください。

1-2. インスタンスプロファイルの作成。
以下のコマンドで、新しいインスタンスプロファイルを作成できます。
        今回は、EC2_Discover_Instana_Sensor_Profileという名前を使用しました。

```
aws iam create-instance-profile --instance-profile-name EC2-discover-instana-sensor_profile
```
実行結果
```
{
    "InstanceProfile": {
        "Path": "/",
        "InstanceProfileName": "EC2-discover-instana-sensor_profile",
        "InstanceProfileId": "xxx",
        "Arn": "arn:aws:iam::your-account-id:instance-profile/EC2-discover-instana-sensor_profile",
        "CreateDate": "2023-12-19T10:52:37+00:00",
        "Roles": []
    }
}
```

1-3. IAMロールをインスタンスプロファイルに追加します。

```
aws iam add-role-to-instance-profile --instance-profile-name EC2-discover-instana-sensor_profile --role-name EC2_discover_instana_sensor
```
1-4.IAMインスタンスプロファイルをEC2インスタンスにアタッチ
作成したインスタンスプロファイルをEC2インスタンスにアタッチします。以下のコマンドを実行してください（instance-idやプロファイル名な適切な値に置き換えてください）
```
aws ec2 associate-iam-instance-profile --instance-id instance-id --iam-instance-profile Name=EC2-discover-instana-sensor_profile
```

1-5. IAMロールがインスタンスプロファイルに追加されたことを確認
実行結果の中に、このセクションがいれば無事紐付けができています。
```
"IamInstanceProfile": {
                       "Arn": "<YOUR_INSTANCE_PROFILE_NAME>",
                       "Id": "xxxxxxxxxxxxxxxxxxxxxx"
                       },
```

これでプロファイルの作成が完了です。

2.手順4で作成したロールをEC2インスタンスにアタッチします。以下のコマンドを実行します。先ほど作成したプロファイルを利用しています。
（instance-idとinstance-profile名は適切な値に置き換えてください）:

```
$aws ec2 associate-iam-instance-profile --instance-id instance-id --iam-instance-profile Name=EC2_Discover_Instana_Sensor
```


## 6. エージェントの設定を行う。
ホストにエージェントを導入すると、configurstion.yamlが作成されます。EC2にSSH接続し、fileコマンドなどで当該ファイルの場所を探してください。見つかったらviなどで編集します。
デフォルトだとこんな感じでコメントアウトされているので、監視したいAWSサービスのコメントアウトを外して、監視を有効化してください。また、enabledフラグをtureに変更してください。

変更前：
![Screenshot 2024-02-21 at 15.58.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492942/b7f50ceb-6b84-fbfb-6cbb-5593405d1c5a.png)

変更後：
![Screenshot 2024-02-21 at 15.59.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492942/1a051762-5c89-0e85-cc81-5c1f2792ca68.png)

監視間隔を変更する場合は、cloudwatch_periodを変更してください。
include_tags、exclude_tagsはコメントアウトのままでも良いです。もちろんコメントアウトを外してタグを指定すれば、そのリソースをInstanaの監視対象にする/しないといった、より高度な運用もできるようになります。


## 7. Instanaエージェントが正常にインストールされたことを確認する。
1. エージェントをインストールしたEC2の詳細画面で「Hostname Type」を取得します。メモ帳などに貼り付けておいてください。あとで使います。
2. Instana UI>左メニュー>インフラストラクチャ・モニタリング画面の検索バーで、先ほど取得した「Hostname Type」で検索します。
![Screenshot 2023-12-19 at 17.28.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492942/9596acb7-ddf9-530a-8ba8-24a3cb7f0f0f.png)
![Screenshot 2023-12-19 at 17.24.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492942/3de01a92-24e4-376b-8678-779d64cfeceb.png)
3.結果が表示されれば、そのホストは無事、Instanaで検知されています。
![Screenshot 2024-01-06 at 16.36.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492942/c889889f-5152-052f-26ae-518c38015ebc.png)
4.エージェントの状態を確認します。
Instana UIの左メニュー＞設定＞エージェントを選択します。エージェント画面の上部の検索ボックスに先ほど取得してきた、値を入力して検索します。「報告中」のステータスになっていれば、エージェントが正常に稼働しています。(バックエンドに対して、データを送信できているということです。)
![Screenshot 2024-02-09 at 10.44.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492942/885fd91d-e99e-a2b3-9b3d-ebd6312ee769.png)



以上です！これでAWS監視の準備が整いました！
Instanaライフを始めましょう！