その辺にいるITインフラ屋さん

たまーに気が向いた時に適当な事を書く個人の日記みたいなもの。個人で作ったアプリのサポートページとしても利用しています。

Route53で利用してるドメインをcert-managerのDNS-01 Challengeで認証させる

過去の記事AmbassadorというAPI Gatewayとして動作させるものがあるので利用してみました。cert-managerHTTP-01 ChallengeDNS設定の認証をさせましたが、この方法だと手作業が発生して面倒です。DNS-01 Challengeで認証させるように変更してみました。



Cert-manager v0.7 to v0.8 の設定内容の変更点

5月21日にCert-managerのv0.8がリリースされていて、 破壊的変更があってわりとはまってましたので、ついでに修正してみました。基本的には公式にv0.7からv0.8へのアップグレードガイドがあるので参考にしています。

ざっくり言うと、もともとCertificateで定義していたACMEの設定が Issuerで設定するように変わりました。

Route53でのDNS-01 Challenge設定

私はドメインをRoute53を利用しているので、そちらを利用して設定を進めます。GKEなのにRoute53なところは気にしないでください。Supported DNS01 providersにサポートしているプロバイダ一覧があります。

Route53を利用する場合は下記のIAM権限を割り当てる必要があります。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "route53:GetChange",
            "Resource": "arn:aws:route53:::change/*"
        },
        {
            "Effect": "Allow",
            "Action": "route53:ChangeResourceRecordSets",
            "Resource": "arn:aws:route53:::hostedzone/*"
        },
        {
            "Effect": "Allow",
            "Action": "route53:ListHostedZonesByName",
            "Resource": "*"
        }
    ]
}

前回の記事で作成をしたcertificate.yamlclusterIssuer.yamlの設定ファイルを修正します。ACMEの設定はClusterIssuerissuer.spec.acme.solversにするようになったようです。

# certificate.yaml
apiVersion: certmanager.k8s.io/v1alpha1
kind: Certificate
metadata:
  name: kubernetes-certificate
  namespace: default
spec:
  secretName: kubernetes-cert-secret
  issuerRef:
    name: letsencrypt-staging
    kind: ClusterIssuer
  dnsNames:
  - <your_domain>

---

apiVersion: certmanager.k8s.io/v1alpha1
kind: ClusterIssuer
metadata:
  name: letsencrypt-staging
spec:
  acme:
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    email: <mail-address>
    privateKeySecretRef:
      name: letsencrypt-staging
    solvers:
    - selector:
        dnsNames:
        - <your_domain>
      dns01:
        route53:
          region: <aws_egion>
          accessKeyID: <Access kew>
          secretAccessKeySecretRef:
            name: mysecret
            key: route53-access-key

--- 
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  route53-access-key: <accesskey>

nginxにhttpsで通信出来てるかの確認

  • kubectl get svc ambassador で EXTERNAL-IPを確認して設定したドメインに登録する
  • <ドメイン名>/nginx/にブラウザで接続するとhttps通信がされるようになりました。
    • httpで接続した際はhttpsにリダイレクトされます。

f:id:mayuki123:20190609064026p:plain


Cert-managerはトラブルシュートがしんどいですね…。無邪気に v0.8にアップデートして試していたら設定が読み込まれなくて、気づくのにかなり時間を費やしました。設定を間違えていると認証局Fake LE Intermediate X1になるんで、設定を見直してみるのが良さそうです。

helm使った方が良い気もするけど、複雑化していきそうで怖い…。