🔆

サーバーレス・コンテナアプリの監視・トラブルシューティング支援プラットフォーム「lumigo」とは(CDK v2対応)

2023/12/26に公開

lumigo

※以降2023年12月26日時点の内容となります。


lumigoとは

開発者向けに構築されたマイクロサービスのトラブルシューティング
エンドツーエンドのトレースと http ペイロード データを使用して、ログを使用せずに本番環境の問題を数分でトラブルシューティングします。

Lumigo プラットフォームは、開発チームと DevOps チームに分散アプリケーションの動作の可視性とコンテキストを提供するように設計されており、複雑なサーバーレス環境やコンテナ化された環境を監視し、簡単にデバッグできるようになります。


Lumigo 分散トレーシングとは

AWS Lambda とコンテナ化されたアプリケーションにさまざまなデプロイメント機能と可観測性機能を提供します。分散トレースを適用するときはドキュメントに従って、リクエストと呼び出しのペイロードを含め、運用環境を確実に可視化してください。

・サーバーレス アプリケーション、つまり AWS Lambda 上で実行するものすべて。
・コンテナ化されたアプリケーション、つまり、Amazon ECS、Amazon EKS、またはその他の Kubernetes などのコンテナ オーケストレーション プラットフォームで実行されるもの。


サーバーレスアプリケーションのインストルメンテーション

AWS Lambda 関数の完全な可観測性を実現するために、Lumigo の AWS Lambda 用分散トレースは自動インストルメンテーション手動インストルメンテーションの両方をサポートしています。

自動インストルメンテーション

Lumigo ラムダ レイヤーを使用することで、自動トレース機能により自動的に Lumigo トレーサーが関数に追加され、コードを 1 行も変更することなくコード ベース全体が計測されます。

手動インストルメンテーション

手動インストルメンテーションにより、ソース コード内から Lumigo トレーサーを制御できるようになり、より高度なトレース情報にアクセスできるようになり、Lumigo を CI/CD パイプラインに統合できるようになります。


コンテナ化されたアプリケーションのインストルメンテーション

コンテナ化されたアプリケーションの完全な可観測性を実現するために、コンテナ化されたアプリケーションの Lumigo の分散トレースはOpenTelemetryに基づいており、 Lumigo OpenTelemetry DistributionsVanilla OpenTelemetryの両方をサポートします。

Lumigo OpenTelemetry ディストリビューション

Lumigo の OpenTelemetry ディストリビューションは、上流の選択された OpenTelemetry パッケージに基づいており、追加の機能があります。

「Vanilla」OpenTelemetry

Lumigo は、「標準的な」OpenTelemetry、つまり、「OpenTelemetryサポート」セクションに記載されているように、コミュニティによって提供される OpenTelemetry SDK および実装をサポートします。


価格


触ってみる

https://lumigo.io/ にアクセス

「Get Started」


「Sine up」


「Create an Account」


Lambdaを選択してみます。


事前にAWSには同ブラウザでログインが完了している状況です。
「Go AWS」ボタンをクリック。


CloudFormationコンソールに飛びました。
そのままスタックを作成してみます。


作成されました。
中身は以下三点のようです。
・IAM Role
・IAM Policy
・Custom Resource


許可は以下のようになっていました。

lumigointegration
lumigointegration
{
    "Statement": [
        {
            "Action": [
                "lambda:UpdateFunctionConfiguration"
            ],
            "Resource": "arn:aws:lambda:*:*:function:*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "ecs:RegisterTaskDefinition"
            ],
            "Resource": "*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "ecs:UpdateService"
            ],
            "Resource": [
                "arn:aws:ecs:*:*:service/*/*"
            ],
            "Effect": "Allow"
        },
        {
            "Action": [
                "ce:GetCostAndUsageWithResources",
                "ce:GetCostAndUsage"
            ],
            "Resource": "*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "events:PutEvents"
            ],
            "Resource": [
                "arn:aws:events:us-west-2:xxxxxxxxxxxx:event-bus/prod_common-resources_customers-event-bus"
            ],
            "Effect": "Allow"
        },
        {
            "Action": [
                "iam:PassRole"
            ],
            "Resource": [
                "arn:aws:iam::xxxxxxxxxxxx:role/LumigoIntegrationV10-LumigoIntegrationRole-xxxxxxxxxxxxx"
            ],
            "Effect": "Allow"
        },
        {
            "Condition": {
                "StringEqualsIfExists": {
                    "iam:PassedToService": [
                        "ecs-tasks.amazonaws.com"
                    ]
                }
            },
            "Action": [
                "iam:PassRole"
            ],
            "Resource": [
                "arn:aws:iam::*:role/*"
            ],
            "Effect": "Allow"
        },
        {
            "Action": [
                "logs:PutSubscriptionFilter",
                "logs:DeleteSubscriptionFilter",
                "logs:DescribeSubscriptionFilters",
                "cloudwatch:PutMetricAlarm",
                "cloudwatch:DeleteAlarms",
                "cloudwatch:PutDashboard",
                "cloudwatch:DeleteDashboards",
                "cloudwatch:PutMetricData",
                "cloudwatch:PutMetricStream",
                "cloudwatch:DeleteMetricStream",
                "cloudwatch:StartMetricStreams",
                "cloudwatch:StopMetricStreams",
                "events:PutRule",
                "events:PutTargets",
                "events:DeleteRule",
                "events:RemoveTargets"
            ],
            "Resource": "*",
            "Effect": "Allow"
        }
    ]
}


「Started Tracing Service」


「Start Tracing」


「Show me my Traces」


「Functions」を見ると選択したLambdaがTracedになっていました。


試しに一度関数を走らせて「Dashboard」を覗いてみます。
「Function Invocations」に反映されています。


AWS Marcketplace

https://aws.amazon.com/marketplace/seller-profile?id=33b56061-d85b-48bd-8b54-7f9d157c5ace


CDK v2対応(一部)

Tokenを準備する

コンソールからTokenをコピーしてSecretsManagerに保存します。






ローカルの任意の場所でディクトリの作成&移動& cdk initを行います。

mkdir lumigoTest && cd lumigoTest && cdk init -l typescript

$ npm install @lumigo/cdk-constructs-v2@0.1.79


一例ですがこんな感じでかきます。

lumigo_test-stack.ts
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import { Lumigo } from '@lumigo/cdk-constructs-v2';
import * as Lambda from 'aws-cdk-lib/aws-lambda';

export class LumigoTestStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);
    //---------------------------------------------------------------//
      const myFunction = new Lambda.Function(this, 'Lambda', {
        functionName: 'HelloWorld',
        handler: 'handler.handler',
        runtime: Lambda.Runtime.NODEJS_18_X,
        code: new Lambda.AssetCode(`./src`),
        memorySize: 512,
        timeout: cdk.Duration.seconds(10),
      });
    cdk.Tags.of(myFunction).add('lumigo:auto-trace', 'true');
    //---------------------------------------------------------------//
  }
}
const app = new cdk.App();
new Lumigo({lumigoToken: cdk.SecretValue.secretsManager('lumigoToken')}).traceEverything(app);




Tracedになっています。


メールも来ます。


「Issue」


詳しくは

Construct HubにDocが存在する為、詳細なインストルメント化のパターン記載について適宜確認。
https://constructs.dev/packages/@lumigo/cdk-constructs-v2/v/0.1.79?lang=typescript

GitHub
https://github.com/lumigo-io/lumigo-cdk-constructs


以上でした

触ってみたのは良いものの、私では「アレと近い」とか「ここが便利」とか判断出来ず。

お詳しい方が考察を添えた記事をやコメントを書いてくださるのを待つ事にします。
有難うございました。

Discussion