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エージェントがインストールされます.インストールしたくない場合はオプションを外せばよいです.
この方法はお手軽ですが,以下のデメリットがあります.
- SSMエージェントをアップデートするには,EC2インスタンスにログインして手作業で行うか,EC2インスタンスをterminateする必要がある.(SSMエージェントを自動アップデートする設定ことも可能)
- SSMエージェントのプロセス監視やログ収集の仕組みがない.必要な場合は自分で作り込む.
DaemonSetでSSMエージェントを起動する
KubernetesのDaemonSetを利用して,workerでSSMエージェントを起動する方法があります.
KubernetesがSSMエージェントのコンテナを管理するので,以下のメリットがあります.
- SSMエージェントのPodが停止した場合は再起動されます.
- SSMエージェントのログはKubernetesを管理できます.
- SSMエージェントの削除やアップデートをkubectlで実行できる.(手作業ではなくGitOpsが可能になる)
DaemonSetのマニフェストを読むと非常に複雑なことをやっているので,セキュリティが気になる場合は目を通しておきましょう.また,現状ではSSMエージェントをバージョンアップするにはDockerイメージの再ビルドが必要です.