kopsでmasterやnodeに自作ポリシーやAWSポリシーをアタッチする

AWS の EC2 上に Kubernetesクラスター立てて運用する時、 EC2 に対して任意のポリシーをアタッチしたいことがある。

kops を使う場合クラスターを最低限動作させるために必要なポリシーは kops 側で作ってくれる。
ただプラスで自分でポリシーを付与する時はちょっと一手間必要だった。

kops は任意のポリシーを追加する時に下記のように spec ファイルに対して additionalPolicies という key に対して node と master に追加したいポリシーを記載する機能をサポートしている。
これはポリシーの JSON の時の Statement にあたる部分になる。

spec:
  additionalPolicies:
    node: |
      [
        {
          "Effect": "Allow",
          "Action": ["es:*"],
          "Resource": ["*"]
        }
      ]
    master: |
      [
        {
          "Effect": "Allow",
          "Action": ["dynamodb:*"],
          "Resource": ["*"]
        }
      ]

これでやりたいことは実現できる。
ただ AWS が提供しているポリシー (AmazonEC2RoleforSSM とか) を使おうと思うとその中の json をコピーして additionalPolicies に貼り付ける必要がある。
これが結構面倒。
一つや二つなら良いのですが、複数のポリシーを使うとなるとどんどん行が伸びていって。。。。

後は自分は terraform でポリシーを作ってるので、それを使いたいのに毎回 json をコピーする必要があるのもちょっと辛かった。

どうしたものかと思っていたら2日前にこれを解決してくれるコードが kops にマージされた。
それがこれ!

github.com

これを使うと自分で定義したポリシーや AWS で用意してくれているポリシーを master や node の IAM Role に付与してくれるっぽい
違ってたらごめんなさい。
定義は下記のように spec file に記載する。

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

ただ2020/02/19時点ではmasterにコードがあるだけなのでリリースはされていない。
そのためこの機能を使いたい時は自分で kops をビルドする必要がある。

Macでビルドするなら git clone https://github.com/kubernetes/kops.git して make kops すればバイナリが生成されると思います。
ただリリースされてないバージョンを使用することになるので、注意してご使用ください。

最後に

だいぶ kops の spec ファイルがスッキリして最高