Open4

external-secretsのECRAuthorizationTokenで別NamespaceのAWS認証トークンのSecretを参照できない件

jlandownerjlandowner

ソースを読んで原因がわかった。

まずECRAuthorizationTokenawsauth.NewGeneratorSession()でAWSの認証情報を取得している。

https://github.com/external-secrets/external-secrets/blob/v0.9.13/pkg/generator/ecr/ecr.go#L63-L74

このawsauth.NewGeneratorSessionの中でcredsFromSecretRef()を実行している。
この時、第二引数が空文字""になっているのがポイント。

https://github.com/external-secrets/external-secrets/blob/v0.9.13/pkg/provider/aws/auth/auth.go#L180

この第二引数はstoreKindというもので、これは単にresolvers.SecretKeyRef()に渡されている。

https://github.com/external-secrets/external-secrets/blob/v0.9.13/pkg/provider/aws/auth/auth.go#L207-L230

このresolvers.SecretKeyRef()の中で、「storeKindesv1beta1.ClusterSecretStoreKindの場合のみSecretRef内のNamespaceを使用し、そうでなければExternalSecretのNamespaceを使用するように」という実装になっていた。

https://github.com/external-secrets/external-secrets/blob/v0.9.13/pkg/utils/resolvers/secret_ref.go#L57-L60

jlandownerjlandowner

resolvers.SecretKeyRef()awsauth.NewGeneratorSession()だけでなく、もう一箇所awsauth.New()でも呼び出されている。
https://github.com/external-secrets/external-secrets/blob/v0.9.13/pkg/provider/aws/auth/auth.go#L100-L106

これはresolvers.SecretKeyRef()が元々Generatorのためではなく、ClusterSecretStoreのための実装であることが伺える。

apiVersion: external-secrets.io/v1beta1
kind: ClusterSecretStore
metadata:
  name: aws-secretsmanager-store
spec:
  provider:
    aws:
      service: SecretsManager
      region: ap-northeast-1
      auth:
        secretRef:
          accessKeyIDSecretRef:
            name: secrets-aws-iam-cred
            namespace: kube-system
            key: AWS_ACCESS_KEY_ID
          secretAccessKeySecretRef:
            name: secrets-aws-iam-cred
            namespace: kube-system
            key: AWS_SECRET_ACCESS_KEY

ClusterSecretStoreだったらどこかのNamespaceにおいた認証Secretが参照できるよというものだ。
GeneratorはNamespacedなリソースなので、別Namespaceは見に行かないよという算段だと思う。

でもそれなら、generatorRefにnamespaceオプションを付与して、ClusterExternalSecretで作成されたExternalSecretの場合に参照できるようにしてほしい。