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をビルド・公開してくださっているので、それを利用します。
また、kube-awsにはaws-ssm-agent対応があるので、ほぼcluster.yamlという設定ファイルの記述を少しいじるだけでセットアップは完了です。ただし、kube-aws 0.9.8の時点ではaws-ssm-agentの動作に必要なIAMポリシーがそのままだと付与されないというバグ?があるので、その点だけ手動でフォローする必要があります。
手順
kube-aws init
、kube-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
clusterName
はk8s1
ということにします。
その場合、クラスタ名でIAMロールを検索すると下記のように3つでてきます。それぞれ、Controllerノード、Etcdノード、Workerノード用です。
それぞれに、AWSマネージドなIAMポリシー「AmazonEC2RoleforSSM」を追加します。
この時点でノードが起動完了してしまっている場合、aws-ssm-agentがエラーを吐き続けているかもしれません。(試した時は少なくともそう見えた)
その場合、aws-ssm-agentを再起動します。
sudo systemctl restart aws-ssm-agent
これで、あとはAWSコンソールから普段どおりRunCommandとAWS-RunShellScript
ドキュメントを使ってクラスタ内の任意のEC2インスタンスに対して任意のシェルコマンドを実行することができます。
例えば、クラスタ内の全インスタンスを対象にしたい場合は、クラスタ名のタグが使えます。
コマンドの実行結果(時刻、成否、標準出力など)は以下のように記録されます。
CloudTrailなども使うと監査ログをとる目的ではかなり良さそうですね。