kops で立てた kubernetes の master, node に Session Manager でセッションを開始する

kops で EC2 上に master, node インスタンスをたてて kubernetesクラスタを立てた時に各インスタンスSSHしたいとする。

そんな時に思いつくのが踏み台サーバーを立ててそれ経由で各インスタンスSSHする方法
これはこれで良いのだけど踏み台自体のポートは開けないといけないし、何より踏み台サーバーが必要になるのでインスタンス台が。。。

そこで AWS Ssytem Manager の Session Manager を使うことを思いつく。

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager.html

これを使うことで SSH をするためにポート開けたり、踏み台を用意しなくてもよくなる。

Session Manager を使用するために必要なことを確認する

Session Manager 前提条件を完了させる を確認してみると SSM Agent が対象のインスタンスで起動する必要がある。

SSM エージェント の使用 を確認するとわかるが Agent は Amazon Linux (2) など一部の AMI にはデフォルトで入っているがそれ以外の場合は自分でインストールして起動設定をする必要がある。

EC2 に必要な権限はドキュメントによるとAmazonSSMManagedInstanceCore が付与されていれば良さそう。
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-getting-started-instance-profile.html

SSM Agentの入ったAMIを作成する

kops がデフォルトで使用するのは kops が用意した Debia ベースの AMI になる。

github.com

そのため SSM Agent は入っていない。
Amazon Linux 2 が使えると良いけどドキュメントにも書いてあるけど Aamazon Linux 2 はまだ実験的で完全にはサポートしていないっぽい。

ということで今回は kops の用意している Debian ベースの AMI に SSM Agent を入れることにする。

ベースとなるAMIは下記のリンクから取得する。

kops/stable at master · kubernetes/kops · GitHub

Image の作成は Packer で行う。

{
  "builders": [{
    "type": "amazon-ebs",
    "region": "ap-northeast-1",
    "source_ami": "ami-09bf3ed345cc17425",
    "instance_type": "t3.micro",
    "ssh_username": "admin",
    "ssh_timeout": "5m",
    "ami_name": "kops-debian-stretch-{{timestamp}}",
    "tags": {
      "Base_AMI_ID": "{{ .SourceAMI }}",
      "Base_AMI_NAME": "{{ .SourceAMIName }}"
    }
    ]
  }],
  "provisioners": [
    {
      "type": "shell",
      "inline": [
        "mkdir /tmp/ssm",
        "cd /tmp/ssm",
        "wget https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/debian_amd64/amazon-ssm-agent.deb",
        "sudo dpkg -i amazon-ssm-agent.deb",
        "sudo systemctl enable amazon-ssm-agent"
      ]
    }
  ]
}

provision のコードはドキュメントのインストールコマンドを使用する https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-manual-agent-install.html#agent-install-debian

policyのアタッチ

blog.hatappi.me

AmazonSSMManagedInstanceCore policyのアタッチは昨日の記事の機能を使用して master, nodeインスタンスにアタッチする。

spec:
  externalPolicies:
    node:
    - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
    master:
    - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore

最後に

インスタンスを入れ替えると無事 Session Managerで master, node インスタンスのセッションを開始することが出来るようになりました。

踏み台も必要なくなりめでたしめでたし。