Amazon EKS クラスターでアプリケーションを有効にする
CloudWatch Application Signals は、Java、Python、Node.js、および .NET スプリケーションでサポートされています。既存の Amazon EKS クラスターでアプリケーションに対して Application Signals を有効にするには、AWS Management Console や AWS CDK を使用するほか、CloudWatch Observability アドオンの自動モニターという高度な設定を使用する方法があります。
トピック
コンソールを使用して Amazon EKS クラスターで Application Signals を有効にする
既存の Amazon EKS クラスターで稼働するアプリケーションで CloudWatch Application Signals を有効にするには、このセクションの手順を実行します。
重要
Application Signals を有効にするアプリケーションで OpenTelemetry を使用している場合は、Application Signals を有効にする前に「OpenTelemetry の互換性」を参照してください。
既存の Amazon EKS クラスターで稼働するアプリケーション向けに Application Signals を有効にするには
注記
Application Signals をまだ有効にしていない場合は、「アカウントで Application Signals を有効にする」の指示に従ってから、以下の手順に従ってください。
CloudWatch コンソールの https://console.aws.amazon.com/cloudwatch/
を開いてください。 [Application Signals] を選択します。
[プラットフォームの指定] では、[EKS] を選択します。
[EKS クラスターを選択] では、Application Signals を有効にするクラスターを選択します。
このクラスターで Amazon CloudWatch Observability EKS アドオンが有効になっていない場合は、有効にするよう求められます。このような場合は、次の操作を行います。
[CloudWatch Observability EKS アドオンの追加] を選択します。Amazon EKS コンソールが表示されます。
[Amazon CloudWatch Observability] のチェックボックスをオンにして [次へ] を選択します。
CloudWatch Observability EKS アドオンにより、Application Signals と CloudWatch Container Insights の両方で、Amazon EKS のオブザーバビリティが向上します。コンテナインサイトの詳細については、Container Insightsを参照してください。
インストールするアドオンの最新バージョンを選択します。
アドオンに使用する IAM ロールを選択します。[ノードから継承] を選択した場合は、ワーカーノードで使用する IAM ロールに適切なアクセス権限をアタッチします。
my-worker-node-role
を Kubernetes ワーカーノードが使用する IAM ロールに置き換えます。aws iam attach-role-policy \ --role-name
my-worker-node-role
\ --policy-arn arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy \ --policy-arn arn:aws:iam::aws:policy/AWSXRayWriteOnlyAccessアドオンを使用するサービスロールを作成する場合は、「Amazon CloudWatch Observability EKS アドオンまたは Helm チャートを使用して CloudWatch エージェントをインストールする」を参照してください。
[次へ] を選択し、画面に表示される情報を確認して [作成] を選択します。
次の画面で、[CloudWatch Application Signals を有効にする] を選択して CloudWatch コンソールに戻り、この有効化のプロセスを終了します。
-
アプリケーションを Application Signals で有効にするには、2 つのオプションがあります。一貫性を保つために、クラスターごとに 1 つのオプションを選択することをお勧めします。
[コンソール] オプションの方が簡単です。この方法を使用すると、直ちにポッドが再起動されます。
[マニフェストファイルに注釈を付ける] メソッドを使用すると、ポッドがいつ再起動するかをより細かく制御でき、モニタリングを一元化したくない場合は、より分散的な方法でモニタリングを管理できます。
注記
ESM を使用する Node.js アプリケーションの Application Signals を有効にしている場合は、ESM モジュール形式を使用する Node.js アプリケーションをセットアップする のセクションに進んでください。
[完了後にサービスを表示] を選択します。Application Signals のビューが開き、Application Signals によって収集されているデータが表示されます。データが表示されるまでに数分かかる場合があります。
別の Amazon EKS クラスターで Application Signals を有効にするには、[サービス] 画面から [Application Signals を有効にする] を選択します。
[サービス] ビューの詳細については、「Application Signals を使用したアプリケーションの運用状態のモニタリング」を参照してください。
注記
Python アプリケーションに WSGI サーバーを使用している場合は、「WSGI サーバーを使用する Python アプリケーションに関する Application Signals データがない」の情報を参照して Application Signals が正しく動作するようにしてください。
また、Application Signals の Python アプリケーションを有効にする際に留意すべきその他の考慮事項を確認しておきます。詳細については、「Application Signals を有効にしたが、その後、Python アプリケーションを起動できない」を参照してください。
ESM モジュール形式を使用する Node.js アプリケーションをセットアップする
ESM モジュール形式を使用する Node.js アプリケーションには限定的なサポートが提供されます。詳細については、「EMS を使用する ENode.js における既知の制限事項」を参照してください。
ESM モジュール形式の場合、コンソールを通じて、またはマニフェスト ファイルに注釈を付けることで Application Signals を有効にしても機能しません。前の手順のステップ 8 をスキップし、代わりに次の手順を実行します。
ESM を使用する Node.js アプリケーションの Application Signals を有効にするには
自動計測のために、関連する依存関係を Node.js アプリケーションにインストールします。
npm install @aws/aws-distro-opentelemetry-node-autoinstrumentation npm install @opentelemetry/instrumentation@0.54.0
アプリケーションの Dockerfile に以下の環境変数を追加して、イメージを構築します。
... ENV OTEL_AWS_APPLICATION_SIGNALS_ENABLED=true ENV OTEL_TRACES_SAMPLER_ARG='endpoint=http://cloudwatch-agent.amazon-cloudwatch:2000' ENV OTEL_TRACES_SAMPLER='xray' ENV OTEL_EXPORTER_OTLP_PROTOCOL='http/protobuf' ENV OTEL_EXPORTER_OTLP_TRACES_ENDPOINT='http://cloudwatch-agent.amazon-cloudwatch:4316/v1/traces' ENV OTEL_AWS_APPLICATION_SIGNALS_EXPORTER_ENDPOINT='http://cloudwatch-agent.amazon-cloudwatch:4316/v1/metrics' ENV OTEL_METRICS_EXPORTER='none' ENV OTEL_LOGS_EXPORTER='none' ENV NODE_OPTIONS='--import @aws/aws-distro-opentelemetry-node-autoinstrumentation/register --experimental-loader=@opentelemetry/instrumentation/hook.mjs' ENV OTEL_SERVICE_NAME='
YOUR_SERVICE_NAME
' #replace with a proper service name ENV OTEL_PROPAGATORS='tracecontext,baggage,b3,xray' ... # command to start the application # for example # CMD ["node", "index.mjs"]環境変数
OTEL_RESOURCE_ATTRIBUTES_POD_NAME
、OTEL_RESOURCE_ATTRIBUTES_NODE_NAME
、OTEL_RESOURCE_ATTRIBUTES_DEPLOYMENT_NAME
、POD_NAMESPACE
、OTEL_RESOURCE_ATTRIBUTES
をアプリケーションのデプロイ yaml ファイルに追加します。例:apiVersion: apps/v1 kind: Deployment metadata: name: nodejs-app labels: app: nodejs-app spec: replicas: 2 selector: matchLabels: app: nodejs-app template: metadata: labels: app: nodejs-app # annotations: # make sure this annotation doesn't exit # instrumentation.opentelemetry.io/inject-nodejs: 'true' spec: containers: - name: nodejs-app image:
your-nodejs-application-image
#replace with a proper image uri imagePullPolicy: Always ports: - containerPort: 8000 env: - name: OTEL_RESOURCE_ATTRIBUTES_POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: OTEL_RESOURCE_ATTRIBUTES_NODE_NAME valueFrom: fieldRef: fieldPath: spec.nodeName - name: OTEL_RESOURCE_ATTRIBUTES_DEPLOYMENT_NAME valueFrom: fieldRef: fieldPath: metadata.labels['app'] # Assuming 'app' label is set to the deployment name - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: OTEL_RESOURCE_ATTRIBUTES value: "k8s.deployment.name=$(OTEL_RESOURCE_ATTRIBUTES_DEPLOYMENT_NAME),k8s.namespace.name=$(POD_NAMESPACE),k8s.node.name=$(OTEL_RESOURCE_ATTRIBUTES_NODE_NAME),k8s.pod.name=$(OTEL_RESOURCE_ATTRIBUTES_POD_NAME)"Node.js アプリケーションをクラスターにデプロイします。
Amazon EKS クラスターでアプリケーションを有効にすると、アプリケーションの状態をモニタリングできます。詳細については、「Application Signals を使用したアプリケーションの運用状態のモニタリング」を参照してください。
CloudWatch Observability アドオンの高度な設定を使用して Amazon EKS クラスターで Application Signals を有効にする
CloudWatch Observability Amazon EKS アドオンのバージョン v4.0.0-eksbuild.1 以降では、アドオンの高度な設定もある一元化された新しい自動モニター設定フラグを使用して、EKS クラスター内のすべてのサービスワークロードに対して自動的に Application Signals を有効にできます。
自動モニター機能を選択するには、アドオンもしくは Helm チャートを作成または更新するときに詳細設定を変更する必要があります。monitorAllServices
を true に設定することで、CloudWatch Observability アドオンはすべての Kubernetes サービスワークロードを検出し、デプロイ時に AWS Distro for OpenTelemetry (ADOT) SDK を自動的に挿入しようとします。また、restartPods
を有効にすると、すべてのサービスワークロードポッドが再起動され、自動再デプロイのプロセスの一環として直ちに ADOT SDK が挿入されます。
--configuration-values '{ "manager":{ "applicationSignals":{ "autoMonitor":{ "monitorAllServices":true, "restartPods":true } } } }'
CloudWatch Observability アドオンでは新しい高度な設定を使用して、必要に応じて特定のサービスを含めたり、除外したりするような、よりきめ細かな制御もできます。詳細については、「Amazon EKS クラスターの Application Signals の設定 」を参照してください。
AWS CDK を使用して Amazon EKS で Application Signals を有効にする
このアカウントで Application Signals をまだ有効にしていない場合は、サービスの検出に必要なアクセス権限を Application Signals に付与する必要があります。「アカウントで Application Signals を有効にする」を参照してください。
アプリケーション向けに Application Signals を有効にします。
import { aws_applicationsignals as applicationsignals } from 'aws-cdk-lib'; const cfnDiscovery = new applicationsignals.CfnDiscovery(this, 'ApplicationSignalsServiceRole', { } );
Discovery CloudFormation リソースは、Application Signals に次のアクセス許可を付与します。
-
xray:GetServiceGraph
-
logs:StartQuery
-
logs:GetQueryResults
-
cloudwatch:GetMetricData
-
cloudwatch:ListMetrics
-
tag:GetResources
このロールの詳細については、「CloudWatch Application Signals のサービスリンクロールのアクセス許可」を参照してください。
-
amazon-cloudwatch-observability
アドオンをインストールします。クラスターに関連付けられた
CloudWatchAgentServerPolicy
と OIDC を使用して IAM ロールを作成します。const cloudwatchRole = new Role(this, 'CloudWatchAgentAddOnRole', { assumedBy: new OpenIdConnectPrincipal(cluster.openIdConnectProvider), managedPolicies: [ManagedPolicy.fromAwsManagedPolicyName('CloudWatchAgentServerPolicy')], });
前の手順で作成した IAM ロールを使用してアドオンをインストールします。
new CfnAddon(this, 'CloudWatchAddon', { addonName: 'amazon-cloudwatch-observability', clusterName: cluster.clusterName, serviceAccountRoleArn: cloudwatchRole.roleArn });
次のいずれかをワークロードマニフェストファイルの
PodTemplate
セクションに追加します。言語 ファイル Java
instrumentation.opentelemetry.io/inject-java: "true"
Python
instrumentation.opentelemetry.io/inject-python: "true"
.Net
instrumentation.opentelemetry.io/inject-dotnet: "true"
Node.js
instrumentation.opentelemetry.io/inject-nodejs: "true"
const deployment = { apiVersion: "apps/v1", kind: "Deployment", metadata: { name: "
sample-app
" }, spec: { replicas: 3, selector: { matchLabels: { "app": "sample-app
" } }, template: { metadata: { labels: { "app": "sample-app
" }, annotations: { "instrumentation.opentelemetry.io/inject-$LANG
": "true" } }, spec: {...}, }, }, }; cluster.addManifest('sample-app
', deployment)