Service Discovery を利用して Sysdig Serverless Orchestrator Agent の名前解決を行う

Orchestrator Agent のサービス間通信を Service Discovery に置き換えてみました。コストを下げる効果が見込めますが、NLB と比べてサポートしていない機能もあるため、見極めが重要です。
2024.05.01

こんにちは! AWS 事業本部コンサルティング部のたかくに(@takakuni_)です。

Service Discovery を利用して、 Sysdig Serverless Orchestrator Agent をホストしてみようと思います

Sysdig Orchestrator Agent

Sysdig Serverless Orchestrator Agent(以後、Orchestrator Agent) は、 Sysdig serverless workload agent(以後、Workload Agent) とセットで利用され、 Workload Agent のテレメトリデータ集約し、 Sysdig SaaS エンドポイントに転送する役割を担います。

Workload Agent は、アプリケーションコンテナと同じ ECS サービス内のサイドカーコンテナとして起動し、 アプリケーションコンテナ のシステムコールをトレースし、Orchestrator Agent へ転送します。

Orchestrator Agent の構成

Orchestrator Agent のデプロイは、 HashiCorp Terraform, AWS CloudFormation またはカスタムデプロイの 3 種類があります。

Terraform, CloudFormation では、ざっくり以下のリソースがデプロイされていきます。

  • NLB
    • Orchestrator Agent のエンドポイントを担う
    • デフォルトでは 6,667 ポートの TCP リスナーが待ち受け
  • ECS
    • Orchestrator Agent コンテナをホストする
    • AWS Fargate で起動可能
  • AutoScaling Group
    • 必要に応じてデプロイ可能

sysdiglabs/terraform-aws-fargate-orchestrator-agent

NLB が高くみえる

弊社、吉川が執筆した ECS on Fargate構成でのSysdig導入における全体費用感を把握してみよう をみると、 NLB のコストが全体の 35 % を占めており、少しばかり高く感じました。

  • 前提
    • 一ヶ月(31日)安定的にECSタスクが2台起動している
    • Auto Scalingは使用しない
    • 「Secure Workload Sec CaaS」のライセンスを2つ購入済み
  • 利用費
    • ライセンス費用
    • 「Secure Workload Sec CaaS」の12ドル×2タスク分のライセンス=24ドル
    • AWSリソース費用(固定費のみ)
    • Orchestrator AgentECSタスクの約11~2ドル
    • NLBの固定費部分約20ドル
  • 合計費用
    • 24ドル+12ドル+20ドル=約56ドル

ECS on Fargate構成でのSysdig導入における全体費用感を把握してみよう | DevelopersIO

要件を確認するに、 NLB じゃなくてもいいかもしれない。 Service Discovery で代替できないか?と思ったのが、今回のブログの意図です。

Manual Instrumentation | Sysdig Docs

Enable HTTP Proxy for Serverless Agents | Sysdig Docs

2024/05/01 追記
技術的には可能だが、何かあった時のサポートは受けづらくなるそうです。今後の機能拡張に期待ですね。

Service Discovery とは

Service Discovery とは、 ECS サービスの名前解決に利用するサービスです。 CloudMap を利用して Private Host Zone のレコードを動的に変更します。構成要素も少なく、シンプルな DNS クエリであればかなり便利な機能です。

ちなみに料金も非常にお手頃価格です。

  • 0.10 USD/登録されたリソース (EC2 インスタンスなど)/月*
  • 0.50 USD/ホストゾーン/月
  • 0.40 USD/100 万件のクエリ – 初回の10 億件/月

料金 - AWS Cloud Map | AWS

Service Discovery で本当にいいのかは要検討

とてもシンプルで、料金もお手頃価格です。ただ次の項目は検討した後にご利用ください。

  • トラフィック関連のメトリクスが提供されていない
  • 基本的な DNS 回答しかできない
    • ELB の CNAME および A レコードの複数値回答(8つまで)をサポート
    • 位置情報ルーティングなどは未サポート
  • クライアントの TTL 設定に依存する可能性あり
  • ロードバランサーのようなリスナールールは設定できない

CON304_Exploring-service-discovery-options-with-Amazon-ECS-and-AWS-Fargate.pdf

ECS Service Connectによるサービスの新しいつなぎ方 / A new way to connect services with ECS Service Connect - Speaker Deck

やってみた

今回は以下の構成で Service Discovery を利用して Sysdig Serverless Orchestrator Agent の名前解決を行ってみようと思います。

利用したコードは以下になります。

Orchestrator Agent のホスト

今回は Terraform Module を新たに作り、ネームスペースを渡してあげる形で作成してみました。

作成したネームスペースも他のサービス間通信で使えると Service Discovery がより有効活用できますね。

orchestrator_agent.tf

############################################
# Service Discovery
############################################
resource "aws_service_discovery_private_dns_namespace" "this" {
  name = "local"
  vpc  = module.vpc.vpc_id
}

############################################
# Fargate Orchestrator Agent
############################################
module "fargate_orchestrator_agent" {
  source = "./modules/fargate_orchestrator_agent"

  vpc_id       = module.vpc.vpc_id
  vpc_cidr     = module.vpc.vpc_cidr_block
  namespace_id = aws_service_discovery_private_dns_namespace.this.id
  subnets      = module.vpc.private_subnets

  access_key     = var.sysdig_access_key # Sysdig access key
  collector_host = var.collector_host    # Sysdig collector host (default:"collector.sysdigcloud.com")
  collector_port = "6443"                # Sysdig collector port (default:"6443")

  name        = "${var.prefix}-orchestrator"               # Identifier for module resources
  agent_image = "quay.io/sysdig/orchestrator-agent:latest" # Orchestrator agent image

  assign_public_ip = false # Provisions a public IP for the service. Required when using an Internet Gateway for egress.
}

モジュールの中身は、ただ NLB を消して Service Discovery を追加してあげました。 TTL の部分は柔軟に変えれるようにすると良さそうですね。

./modules/fargate_orchestrator_agent/service-discovery.tf

resource "aws_service_discovery_service" "this" {
  name = "orchestrator-agent"

  dns_config {
    namespace_id   = var.namespace_id
    routing_policy = "MULTIVALUE"
    dns_records {
      ttl  = 10
      type = "A"
    }
  }

  health_check_custom_config {
    failure_threshold = 1
  }
}

Sysdig コンソールからの確認

Sysdig コンソールで Orchestrator Agent および、 Workload Agent を認識しているか確認します。

1 台ずつの合計 2 台、認識されていました。

検知させてみる

最後に検知機能が正しく反応するか確認してみます。 ALB の DNS 名に HTTP でアクセスすると DVWA の画面に遷移するためそこからいくつか攻撃を実行してみます。

いくつかコマンドインジェクションを行った結果です。期待通り検知できていました。

まとめ

以上、「Service Discovery を利用して Sysdig Serverless Orchestrator Agent の名前解決を行う」でした。

小規模、中規模利用で NLB のコストが高くつきそうなお客様は是非ご検討いただけますと幸いです。

このブログがどなたかの参考になれば幸いです。 AWS 事業本部コンサルティング部のたかくに(@takakuni_) でした!