AWS
kubernetes

kube-awsでaws-ssm-agentとRunCommandを試してみる

kube-awsとは

AWS上にKubernetesクラスタをつくるツールです。GolangやCloudFormation、Container Linux(旧CoreOS)をベースにしています。

RunCommandとは

Amazon EC2 Systems Managerというサービスの一機能で、AWSのAPI経由でEC2インスタンスにざまざまなコマンドを実行させることができます。

aws-ssm-agentとは

RunCommandで送られたコマンドを実際に実行するデーモンです。

概要

kube-awsクラスタでRunCommandが利用できるようにします。

まず、aws-ssm-agentは公式にはrpmなどで配布されているのですが、基本的にContainer Linuxにはパッケージマネージャ的なものが存在しないのでそれが利用できません。そのため、Container Linux向けにビルドしたaws-ssm-agentをなんとかして手に入れる必要があります。

ありがたいことに、DailyHotelという会社さんがContainer Linux向けにaws-ssm-agentをビルド・公開してくださっているので、それを利用します。

https://github.com/DailyHotel/amazon-ssm-agent

また、kube-awsにはaws-ssm-agent対応があるので、ほぼcluster.yamlという設定ファイルの記述を少しいじるだけでセットアップは完了です。ただし、kube-aws 0.9.8の時点ではaws-ssm-agentの動作に必要なIAMポリシーがそのままだと付与されないというバグ?があるので、その点だけ手動でフォローする必要があります。

手順

kube-aws initkube-aws renderを実行して必要なファイルを生成したあと、cluster.yamlに以下を追記します。

amazonSsmAgent:
  enabled: true
  downloadUrl: https://github.com/DailyHotel/amazon-ssm-agent/releases/download/v2.0.805.1/ssm.linux-amd64.tar.gz
  sha1sum: a6fff8f9839d5905934e7e3df3123b54020a1f5e

clusterNamek8s1ということにします。
その場合、クラスタ名でIAMロールを検索すると下記のように3つでてきます。それぞれ、Controllerノード、Etcdノード、Workerノード用です。

image.png

それぞれに、AWSマネージドなIAMポリシー「AmazonEC2RoleforSSM」を追加します。

image.png

この時点でノードが起動完了してしまっている場合、aws-ssm-agentがエラーを吐き続けているかもしれません。(試した時は少なくともそう見えた)

その場合、aws-ssm-agentを再起動します。

sudo systemctl restart aws-ssm-agent

これで、あとはAWSコンソールから普段どおりRunCommandとAWS-RunShellScriptドキュメントを使ってクラスタ内の任意のEC2インスタンスに対して任意のシェルコマンドを実行することができます。

例えば、クラスタ内の全インスタンスを対象にしたい場合は、クラスタ名のタグが使えます。

image.png

コマンドの実行結果(時刻、成否、標準出力など)は以下のように記録されます。

image.png

CloudTrailなども使うと監査ログをとる目的ではかなり良さそうですね。