[IBMCloud] もう期限切れで焦らない！IKSのTLS証明書を自動更新する仕組みを作る Part3

## 作業概要
設定済みのSecret ManagerをIKSクラスタと接続し構成することで、デフォルトのIKS Ingress証明書ではなく、Secret Managerで自動更新された証明書をIKSで利用できるため、証明書管理という観点ではSecret ManagerのみでOKとなる。

通常、デフォルトで発行されるIKS証明書の場合、90日ごとに更新される
しかし、それを参照して利用するアプリケーションなどは自動更新されないため、手動で更新する運用が必要となる。

これを解消するためにSecret Managerで一元管理し証明書を自動更新することで手間を減らすことができる。また、カスタムドメインの証明書も自動更新して利用できるため、運用性は高くなる。


## 全体の流れ
ボリュームがあるので、全5回で記事を記載します。
本記事では「3.IKSとSecret Managerの連携設定と自動更新の確認」の内容を記載

**前回**
1.[自動証明書管理環境（ACME）のセットアップと認証局の構成](https://qiita.com/khoshina/items/c435a155b7048d8a9069)
2.[DNS Providerの設定と自動更新カスタムドメイン証明書(パブリック)の発行](https://qiita.com/khoshina/items/65ac174f20924b486b4c)

**本記事はこちら**
<font color="red">**3.[IKSとSecret Managerの連携設定と自動更新の確認]**</font>

**次回以降**
4.[IKSからパブリック証明書の参照と自動更新](https://qiita.com/khoshina/items/c2e5b22877a48629a671)
5.[IngressALBから証明書の利用とアプリケーションへのHTTPS動作確認](https://qiita.com/khoshina/items/c436d1d20703aec19cfc)

**全体図**
IKSでSecret Managerを利用して、IngressALBにPublic証明書を適用し、証明書の自動更新を行う一例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/a0522f04-e045-44c9-a439-b012b6ddb589.png)

## Secret ManagerとIKSのサービス間アクセス許可
はじめに、SecretManagerとIKS間のサービス連携のためのアクセス権の追加が必要になるため、その設定を実施する

IAM -> Authorizations -> Createを選択
![貼り付けた画像_2025_05_20_14_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/882f45d7-3902-4bec-846f-bdb89b0a308b.png)

**Sourceの設定**
Source account: This account
Routing: Kubernetes Service
Resources: All
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/096d49b0-e606-4d0b-8e05-719290342fcd.png)

**Targetの設定**
Service: Secrets Manager
Resources: All
Roles: Manager
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/eae6ceb5-2a18-4cfc-904f-4de746325c44.png)

## SecretsManagerインスタンスをクラスターに登録
**まずSecrets Managerのinstance IDを確認する**
"5074d80d-949c-468e-9991-7cb884063380"がInstance IDとなる
```
% ibmcloud resource service-instances --service-name secrets-manager
xxx@ibm.com としてアカウント xxx's Account の すべての場所 で リソース・グループ acs-paas 内の タイプ service_instance のインスタンスを取得しています...
OK
名前                       ロケーション   状態     タイプ             リソース・グループ ID
Secrets Manager-acs-paas   jp-tok         active   service_instance   d72766061fce4e839ce2bdd1247e621c

% ibmcloud resource service-instance "Secrets Manager-acs-paas" --guid
xxx@ibm.com としてアカウント xxx's Account の リソース・グループ acs-paas のサービス・インスタンス Secrets Manager-acs-paas を取得しています...
5074d80d-949c-468e-9991-7cb884063380
```

**Instance IDがわかったら、下記コマンドにてCRNを確認**
ibmcloud resource service-instance <instance_name>
CRNは「crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380::」であることがわかる

```
% ibmcloud resource service-instance 5074d80d-949c-468e-9991-7cb884063380
xxx@ibm.com としてアカウント xxx's Account の リソース・グループ acs-paas のサービス・インスタンス 5074d80d-949c-468e-9991-7cb884063380 を取得しています...
OK

名前:                       Secrets Manager-acs-paas
ID:                         crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380::
GUID:                       5074d80d-949c-468e-9991-7cb884063380
場所:                       jp-tok
サービス名:                 secrets-manager
サービス・プラン名:         standard
リソース・グループ名:       acs-paas
状態:                       active
タイプ:                     service_instance
サブタイプ:
ロック中:                   false
1回限りのクレデンシャル：   false
作成日時:                   2024-04-07T23:44:00Z
作成元:                     xxx@ibm.com
更新日時:                   2024-05-13T08:05:41Z
最後の操作:
                            状況         sync succeeded
                            メッセージ   Synchronized the instance
```

**次に確認したCRNを元にクラスターとSecret Managerを登録する**
```
% ibmcloud ks ingress instance register --cluster cv4ef49t0jeirigoaasg --crn crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380:: --is-default
OK
```

**Secrets Manager インスタンスがクラスターに登録されていることを確認**
```
% ibmcloud ks ingress instance ls --cluster cv4ef49t0jeirigoaasg
OK
名前                       タイプ            デフォルト   状況      シークレット・グループ   CRN
secrets-manager-acs-paas   secrets-manager   true         created   acs-paas                 crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380::
```

GUIからもシークレットが作成されたことが確認できる
![貼り付けた画像_2025_05_20_14_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/4a171919-25a1-437a-aa63-44834d1c153e.png)

削除したい場合は下記のコマンドで実施できる
```
% ibmcloud ks ingress secret rm --cluster cv4ef49t0jeirigoaasg --name ingress-alb-tls --namespace default
OK
```

## SecretsManagerインスタンスを設定して、シークレットを再生成
すべての新規 Ingress サブドメイン証明書がこのインスタンスに保管されるように、
デフォルトとしてSecret managerを指定する

```
% ibmcloud ks ingress instance default set --cluster cv4ef49t0jeirigoaasg --name secrets-manager-acs-paas
OK
```

現在のSecretを確認する
```
% ibmcloud ks ingress secret ls --cluster cv4ef49t0jeirigoaasg
OK
名前                                                名前空間         CRN                                                                                                                                                                有効期限                   ドメイン                                                                              状況      タイプ
acs-sectest-d13c20a300620486546182a0effece00-0000   default          crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380:secret:ae2673ed-958c-0324-b6db-dd75277acd12   2025-06-03T23:14:32+0000   acs-sectest-d13c20a300620486546182a0effece00-0000.jp-tok.containers.appdomain.cloud   created   TLS
acs-sectest-d13c20a300620486546182a0effece00-0000   ibm-cert-store   crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380:secret:ae2673ed-958c-0324-b6db-dd75277acd12   2025-06-03T23:14:32+0000   acs-sectest-d13c20a300620486546182a0effece00-0000.jp-tok.containers.appdomain.cloud   created   TLS
acs-sectest-d13c20a300620486546182a0effece00-0000   kube-system      crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380:secret:ae2673ed-958c-0324-b6db-dd75277acd12   2025-06-03T23:14:32+0000   acs-sectest-d13c20a300620486546182a0effece00-0000.jp-tok.containers.appdomain.cloud   created   TLS
```

クラスター内の nlb-dns サブドメインを一覧表示
```
% ibmcloud ks nlb-dns ls --cluster cv4ef49t0jeirigoaasg
OK
サブドメイン                                                                          ターゲット                           SSL 証明書の状況   SSL 証明書の秘密名                                  秘密の名前空間   状況
acs-sectest-d13c20a300620486546182a0effece00-0000.jp-tok.containers.appdomain.cloud   3bc64147-jp-tok.lb.appdomain.cloud   created            acs-sectest-d13c20a300620486546182a0effece00-0000   default          OK
```

IBM管理対象シークレットの再生成
```
% ibmcloud ks nlb-dns secret regenerate --cluster cv4ef49t0jeirigoaasg --nlb-subdomain acs-sectest-d13c20a300620486546182a0effece00-0000.jp-tok.containers.appdomain.cloud
NLB サブドメインの証明書および秘密を再生成中...
注: 変更が適用されるまで数分かかる場合があります。
OK
```

有効期限が変わっているため、シークレットが再生成されたことがわかる
```
% ibmcloud ks ingress secret ls --cluster cv4ef49t0jeirigoaasg
OK
名前                                                名前空間         CRN                                                                                                                                                                有効期限                   ドメイン                                                                              状況      タイプ
acs-sectest-d13c20a300620486546182a0effece00-0000   default          crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380:secret:ae2673ed-958c-0324-b6db-dd75277acd12   2025-06-04T01:56:05+0000   acs-sectest-d13c20a300620486546182a0effece00-0000.jp-tok.containers.appdomain.cloud   created   TLS
acs-sectest-d13c20a300620486546182a0effece00-0000   ibm-cert-store   crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380:secret:ae2673ed-958c-0324-b6db-dd75277acd12   2025-06-04T01:56:05+0000   acs-sectest-d13c20a300620486546182a0effece00-0000.jp-tok.containers.appdomain.cloud   created   TLS
acs-sectest-d13c20a300620486546182a0effece00-0000   kube-system      crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380:secret:ae2673ed-958c-0324-b6db-dd75277acd12   2025-06-04T01:56:05+0000   acs-sectest-d13c20a300620486546182a0effece00-0000.jp-tok.containers.appdomain.cloud   created   TLS
```

## Secret Managerに登録された証明書を参照し、新しいシークレットを作成
Secret Managerで証明書が管理・自動更新されるようになったため
その証明書を参照する形で新しいシークレットを作成することができる

ibmcloud ks ingress secret create --name <任意名> --cluster <対象クラスタID> --cert-crn <参照CRN> --namespace <利用するPODを作成するNamespace>

参照CRNはSecret Managerで管理されるようになった証明書のCRNを記載する

調べ方1：下記コマンドで表示される証明書のCRN

```
% ibmcloud ks ingress secret ls --cluster cv4ef49t0jeirigoaasg
OK
名前                                                名前空間         CRN                                                                                                                                                                有効期限                   ドメイン                                                                              状況      タイプ
acs-sectest-d13c20a300620486546182a0effece00-0000   default          crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380:secret:ae2673ed-958c-0324-b6db-dd75277acd12   2025-06-04T01:56:05+0000   acs-sectest-d13c20a300620486546182a0effece00-0000.jp-tok.containers.appdomain.cloud   created   TLS
```

調べ方2：IBMCloud Portalより確認
Secret Managerのリソースから対象インスタンスを選択すると、右下にCRNが表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/3fd9fc31-0e8d-4743-b276-e0ec083371bf.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/8c36e6ea-dc5c-4a02-945c-14fa95a6c2bb.png)

CRNが確認できたので、新しいシークレットを作成
"testcert"という名前で"test"のネームスペースに作成
```
ibmcloud ks ingress secret create --name testcert --cluster cv4ef49t0jeirigoaasg --cert-crn crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380:secret:ae2673ed-958c-0324-b6db-dd75277acd12 --namespace test
OK
```

確認
CRNと有効期限が一致した"testcert"が作成される
```
% ibmcloud ks ingress secret ls --cluster cv4ef49t0jeirigoaasg
OK
名前                                                名前空間         CRN                                                                                                                                                                有効期限                   ドメイン                                                                              状況      タイプ
acs-sectest-d13c20a300620486546182a0effece00-0000   default          crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380:secret:ae2673ed-958c-0324-b6db-dd75277acd12   2025-06-04T01:56:05+0000   acs-sectest-d13c20a300620486546182a0effece00-0000.jp-tok.containers.appdomain.cloud   created   TLS
acs-sectest-d13c20a300620486546182a0effece00-0000   ibm-cert-store   crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380:secret:ae2673ed-958c-0324-b6db-dd75277acd12   2025-06-04T01:56:05+0000   acs-sectest-d13c20a300620486546182a0effece00-0000.jp-tok.containers.appdomain.cloud   created   TLS
acs-sectest-d13c20a300620486546182a0effece00-0000   kube-system      crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380:secret:ae2673ed-958c-0324-b6db-dd75277acd12   2025-06-04T01:56:05+0000   acs-sectest-d13c20a300620486546182a0effece00-0000.jp-tok.containers.appdomain.cloud   created   TLS
testcert                                            test             crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380:secret:ae2673ed-958c-0324-b6db-dd75277acd12   2025-06-04T01:56:05+0000   acs-sectest.jp-tok.containers.appdomain.cloud                                         created   TLS
```

## 証明書更新時の動作
Secret Managerの証明書はデフォルトで90日間の有効期限を持っており、有効期限の31日前に自動で更新が行われる参照元の証明書が更新された場合、参照した証明書も自動で更新されるか確認する

下記三つの証明書である"crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380:secret:ae2673ed-958c-0324-b6db-dd75277acd12"を手動でローテートする
```
% ibmcloud ks ingress secret ls --cluster cv4ef49t0jeirigoaasg
OK
名前                                                名前空間         CRN                                                                                                                                                                有効期限                   ドメイン                                                                              状況      タイプ
acs-sectest-d13c20a300620486546182a0effece00-0000   default          crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380:secret:ae2673ed-958c-0324-b6db-dd75277acd12   2025-06-04T03:13:29+0000   acs-sectest-d13c20a300620486546182a0effece00-0000.jp-tok.containers.appdomain.cloud   created   TLS
acs-sectest-d13c20a300620486546182a0effece00-0000   ibm-cert-store   crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380:secret:ae2673ed-958c-0324-b6db-dd75277acd12   2025-06-04T03:13:29+0000   acs-sectest-d13c20a300620486546182a0effece00-0000.jp-tok.containers.appdomain.cloud   created   TLS
acs-sectest-d13c20a300620486546182a0effece00-0000   kube-system      crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380:secret:ae2673ed-958c-0324-b6db-dd75277acd12   2025-06-04T03:13:29+0000   acs-sectest-d13c20a300620486546182a0effece00-0000.jp-tok.containers.appdomain.cloud   created   TLS
```

ローテート対象のSecretsを選択し、右のメニューから"Rotate"を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/df0b4e8b-ec03-48bd-ba5f-90fd177ee388.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/8f358da8-0073-4eee-9208-ec37a0b76f0c.png)

ローテートが完了すると、しばらくしたら有効期限が新しい状態になるため更新されたことがわかる
```
% ibmcloud ks ingress secret ls --cluster cv4ef49t0jeirigoaasg
OK
名前                                                名前空間         CRN                                                                                                                                                                有効期限                   ドメイン                                                                              状況      タイプ
acs-sectest-d13c20a300620486546182a0effece00-0000   default          crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380:secret:ae2673ed-958c-0324-b6db-dd75277acd12   2025-06-04T03:13:29+0000   acs-sectest-d13c20a300620486546182a0effece00-0000.jp-tok.containers.appdomain.cloud   created   TLS
acs-sectest-d13c20a300620486546182a0effece00-0000   ibm-cert-store   crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380:secret:ae2673ed-958c-0324-b6db-dd75277acd12   2025-06-04T03:13:29+0000   acs-sectest-d13c20a300620486546182a0effece00-0000.jp-tok.containers.appdomain.cloud   created   TLS
acs-sectest-d13c20a300620486546182a0effece00-0000   kube-system      crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380:secret:ae2673ed-958c-0324-b6db-dd75277acd12   2025-06-04T03:13:29+0000   acs-sectest-d13c20a300620486546182a0effece00-0000.jp-tok.containers.appdomain.cloud   created   TLS
testcert                                            test             crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380:secret:ae2673ed-958c-0324-b6db-dd75277acd12   2025-06-04T01:56:05+0000   acs-sectest.jp-tok.containers.appdomain.cloud                                         created   TLS
```

先ほど作った"testcert"と更新した証明書の有効期限だけが異なる状態
testcertは今回更新した証明書を参照しているため、有効期限も一緒になるはずだが、この同期処理は1日1回行われる。まだ反映されていないことから、有効期限が異なって見えている。

参考：[登録済みの Secrets Manager インスタンスに保管されているシークレットは自動的に更新されますか?](https://cloud.ibm.com/docs/containers?topic=containers-secrets-mgr#secrets-mgr_migration_faq)

1日経過後の状態は下記
```
% ibmcloud ks ingress secret ls --cluster cv4ef49t0jeirigoaasg
OK
名前                                                名前空間         CRN                                                                                                                                                                有効期限                   ドメイン                                                                              状況      タイプ
acs-sectest-d13c20a300620486546182a0effece00-0000   default          crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380:secret:ae2673ed-958c-0324-b6db-dd75277acd12   2025-06-04T03:13:29+0000   acs-sectest-d13c20a300620486546182a0effece00-0000.jp-tok.containers.appdomain.cloud   created   TLS
acs-sectest-d13c20a300620486546182a0effece00-0000   ibm-cert-store   crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380:secret:ae2673ed-958c-0324-b6db-dd75277acd12   2025-06-04T03:13:29+0000   acs-sectest-d13c20a300620486546182a0effece00-0000.jp-tok.containers.appdomain.cloud   created   TLS
acs-sectest-d13c20a300620486546182a0effece00-0000   kube-system      crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380:secret:ae2673ed-958c-0324-b6db-dd75277acd12   2025-06-04T03:13:29+0000   acs-sectest-d13c20a300620486546182a0effece00-0000.jp-tok.containers.appdomain.cloud   created   TLS
testcert                                            test             crn:v1:bluemix:public:secrets-manager:jp-tok:a/db415c559c0e468cb9414edb82aee6fe:5074d80d-949c-468e-9991-7cb884063380:secret:ae2673ed-958c-0324-b6db-dd75277acd12   2025-06-04T03:13:29+0000   acs-sectest.jp-tok.containers.appdomain.cloud                                         created   TLS
```

証明書の有効期限が参照元と一致し、1日一回の同期がうまくいっていることを確認できる

---

続き「[4.IKSからパブリック証明書の参照と自動更新](https://qiita.com/khoshina/items/c2e5b22877a48629a671)」