その辺にいる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使った方が良い気もするけど、複雑化していきそうで怖い…。