GeekFactory

int128.hatenablog.com

EKS workerにSSMセッションマネージャで接続する

EC2インスタンスをプライベートサブネットに配置する場合,EC2インスタンスSSHで接続するには踏み台が必要になります.Systems Managerのセッションマネージャーを利用すると,踏み台を経由せずにEC2インスタンスSSHで接続できます.もはやターミナルも必要なく,WebブラウザがあればSSHで接続できます.とても便利ですね.

ところが,EKS workerのデフォルトAMI(amazon-eks-node-1.13-v20190701, ami-0fde798d17145fae1)にはSSMエージェントが入っていないため,デフォルトではセッションマネージャーを利用できません.どんな解決方法があるのか調べてみました.

EC2インスタンスの起動時にSSMエージェントをインストールする

userdataを利用して,EC2インスタンスの起動時にSSMエージェントをインストールします.terraform-aws-modules/eks/aws を利用している場合は以下のようになります.

module "eks" {
  source  = "terraform-aws-modules/eks/aws"
  version = "5.1.0"

  worker_groups = [
    {
      name = "worker-group-1"
      # SSMエージェントをインストールする
      # https://docs.aws.amazon.com/systems-manager/latest/userguide/ssm-agent.html
      additional_userdata = "sudo yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm"
    },
  ]

  # SSMに必要なポリシーをアタッチする
  workers_additional_policies = ["${aws_iam_policy.worker.arn}"]
}

resource "aws_iam_policy" "worker" {
  name        = "worker"
  description = "IAM policy for Kubernetes workers"
  # https://docs.aws.amazon.com/systems-manager/latest/userguide/getting-started-create-iam-instance-profile.html
  policy = "${file("eks_worker_policy.json")}"
}

additional_userdata オプションを指定したworker groupにはSSMエージェントがインストールされます.インストールしたくない場合はオプションを外せばよいです.

この方法はお手軽ですが,以下のデメリットがあります.

DaemonSetでSSMエージェントを起動する

KubernetesのDaemonSetを利用して,workerでSSMエージェントを起動する方法があります.

github.com

KubernetesがSSMエージェントのコンテナを管理するので,以下のメリットがあります.

  • SSMエージェントのPodが停止した場合は再起動されます.
  • SSMエージェントのログはKubernetesを管理できます.
  • SSMエージェントの削除やアップデートをkubectlで実行できる.(手作業ではなくGitOpsが可能になる)

DaemonSetのマニフェストを読むと非常に複雑なことをやっているので,セキュリティが気になる場合は目を通しておきましょう.また,現状ではSSMエージェントをバージョンアップするにはDockerイメージの再ビルドが必要です.

参考文献