[CicleCI] aws-eks、kubernetes のorbsを併用してECR -> EKS へのローリングアップデートの構成

#CicleCIで cicleci/kubernetes orbsと, aws-eks/kubernetes orbsを併用し、ECRへプッシュしたイメージを使用し、EKSのpodsを更新する

:::note warn
個人用のメモなので最低限しか記述していません。参考にされる場合は補完して下さい
CicleCIのkubernetes orbsを使用したことがある人向けの記事です。
:::

***
■なぜこの記事を書いたか：
・ 2021-12-08の更新でkubeconfigのdry-runがbool値からstring値のみになりました。
　　これにより、今まで使用していたECRへのイメージプッシュ->EKSの自動ローリングアップデートのパイプラインが破壊されたため構成し直すために調査しました。

■なぜEKSへの自動アップデートがうまくいかなくなったのか

・aws-eks orbsの[update-kubeconfig-with-authenticator]コマンドでdry-runを設定できるが、許可されているのはbool値のみ。defaultは'false'

・aws-eks orbsの[update-container-image]コマンドのオプションとしてdry-run(false)を実行してしまうため、Error：bool値は許可できないよ。stringの"none","server","client"とかを使ってねとなりこけるようになった。

■模索した解決法：

・aws-eks/kubernetes orbsの[update-container-image]コマンドはworkflowsでしか宣言できないと思っていたが、cicleci/kubernetes orbsのコンフィグと併用することでjobsで宣言することができるか試すため。

***
どんな時に使用するか：
　・kubectlのバージョンを指定したい時
　・jobsで生成した変数を利用したい時
　・kubernetesに更新があり、aws-eks/orbsへの更新反映が遅い時
　　⬆︎今回やろうと思った原因です。

***
どういったことをするのか：
　AWS-EKS用のaws-eks/kubernetes orbsでAWSのリージョンと、EKSのクラスター名を指定することにより
　cicleci/kubernetesのorbsの実行先をAWSに向けることができる。
　あとはコマンドを実行することで、ECR -> EKS の自動化ができます。

:::note warn
　※ 前提条件として、ブランチへのpush時にCicleCIを動作させるように構築しておく必要があります。
:::

***

■ コンテキストを設定する
・CicleCIの環境変数を設定するを参考に、AWSリソースへアクセスするために必要な環境変数を設定してください。
※以下参考URLでは、プロジェクトの環境変数となっていますが、後述のコードではコンテキストを使用することになっています。
このコンテキストで使用されている定義済み変数はコマンド実行時に自動的に読み込まれます。
https://circleci.com/docs/ja/2.0/ecs-ecr/

\${AWS_ACCESS_KEY_ID}: AWSのアクセスキー ECR,EKSへのアクセス時に使用
\${AWS_SECRET_ACCESS_KEY}: AWSのシークレットキー ECR,EKSへのアクセス時に使用


・こちらはコマンド実行のパラメータ値に使用するので、好きな変数名をつけてください
\${AWS_REGION}: AWSのリージョン名
\${AWS_ECR_REPOSITORY_NAME}: AWS ECRのリポジトリ名
\${AWS_EKS_CLUSTER_NAME}: AWS EKSのクラスター名


■ CicleCIの事前定義済みの変数
\${CIRCLE_SHA1}: ECRリポジトリに登録した時に生成される一意なダイジェスト値

###1. aws-eksでauthenticatorを設定
後述のcicleci/kubernetesの向き先をAWSにするために、AWSの認証情報などを上記のようにコンテキストに設定する必要があります。
参考：
https://circleci.com/developer/ja/orbs/orb/circleci/aws-eks?version=1.1.0#jobs-update-container-image


###2. kubernetes でコマンドを宣言する（例はEKSへのkubectl set imageによるローリングアップデート）
参考：
https://circleci.com/developer/orbs/orb/circleci/kubernetes?version=1.0.1#commands-update-container-image


以下、コード抜粋
詳細はコメントに

##使用するorbs

```
orbs:
  node: circleci/node@3.0.0
  aws-ecr: circleci/aws-ecr@7.0.0 # イメージをECRへpushする
  aws-eks: circleci/aws-eks@1.1.0 # ECRリポジトリに登録されているイメージでEKSを更新する
  kubernetes: circleci/kubernetes@1.0.1 # authenticator を設定する
```


##job①: aws-ecr/build-and-push-imageを使用し、イメージをECRへpushする

```
ecr-push-image:
    executor: aws-ecr/default
    steps:
      - checkout
      # - https://circleci.com/developer/orbs/orb/circleci/aws-ecr
      - aws-ecr/build-and-push-image:
          repo: ${AWS_ECR_REPOSITORY_NAME}
          tag: ${CIRCLE_SHA1}
```

##job②: ECRリポジトリにプッシュしたイメージをEKSへ反映させる

 ```
eks-update-container-image:
    executor: aws-eks/python3
    steps: 
      # 不意なkubernetesのアップデートでorbsの更新が間に合っていない時などに,
　　　 # 過去のバージョンでkubectlのバージョンを指定することも可能。
      # - kubernetes/install-kubectl:
      #    kubectl-version: "1.22"
      - aws-eks/update-kubeconfig-with-authenticator: # AWS-EKSのorbs
          cluster-name: "${AWS_EKS_CLUSTER_NAME}"
          aws-region: "${AWS_REGION}"
          install-kubectl: true
      - kubernetes/update-container-image: # kubernetesのorbs
          resource-name: deployment/web # yamlのリソース名
          namespace: web # pods の名前空間
          # `kubectl set image`を介してリソースに適用するコンテナイメージの更新のARN
          container-image-updates: "web=${リポジトリ名など}:${CIRCLE_SHA1}"
          show-kubectl-command: true # CircleCIにkubectlのコマンドログを残す
          get-rollout-status: false # check the rollout successfully
          dry-run: "none" # 2021-12-08より、bool値が廃止されstring値になった
```


## workflows: jobの実行順を記載する

```
      - ecr-push-image: # job①
          context: context # jobで使用するコンテキストの名前を指定する
          filters: # フィルターを使用すると特定のブランチのプッシュ時のみ実行する
            branches:
              only: dev # ブランチ名
      - eks-update-container-image: # job②
          context: context 
          filters:
            branches:
              only: dev
          requires: # 指定したworkflowが完了してから実行するように順序を指定する
            - ecr-push-image  
```

おしまい。