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 になる。
そのため 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のアタッチ
AmazonSSMManagedInstanceCore
policyのアタッチは昨日の記事の機能を使用して master, nodeインスタンスにアタッチする。
spec: externalPolicies: node: - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore master: - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
最後に
インスタンスを入れ替えると無事 Session Managerで master, node インスタンスのセッションを開始することが出来るようになりました。
踏み台も必要なくなりめでたしめでたし。