CrossplaneでAWS Route53のZoneを作成したら、どんな情報が得られるのか?

CrossplaneでAWS Route53のZoneリソースを作成すると、どのような情報が取得できるのか気になったので検証してみました。
本稿では、実際にZoneリソースを作成して得られる様々な情報(external-name、ネームサーバー、ARN、ゾーンID)について、具体的な値とその格納場所を紹介します。

## 結論

Zoneリソースを作成すると、以下の情報が取得できます: 

- external-name: Route53のホストゾーンID(例: `Z00601612X8VLNNVAI1QZ`)
- ネームサーバー: AWSが割り当てた4つのネームサーバー
- ARN: Amazon Resource Name
- ゾーンID: Route53のゾーン識別子

これらの情報は、Kubernetes上でのDNS管理や他のAWSリソースとの連携に活用できます。

## 検証環境

本稿では、以下の環境で検証を行いました: 

- kind v0.26.0
- Crossplane v1.19.0
- AWS Provider for Route53 v1.20.1
- AWS CLIとRoute53の権限を持つIAMユーザー

## 検証環境の構築手順

### 1. 必要なツールのインストール

まず、以下のツールを準備します: 

- Docker
- devbox(kind, kubectlを自動的に導入)
- AWS CLI
- Route53の権限を持つIAMユーザーのアクセスキー

### 2. kindクラスタの作成

kindを使って新しいKubernetesクラスタを作成します: 

```bash
kind create cluster
```

### 3. Crossplaneのインストール

Helmを使ってCrossplaneをインストールします: 

```bash
# Helmリポジトリの追加
helm repo add crossplane-stable https://charts.crossplane.io/stable
helm repo update

# Crossplaneのインストール
helm install crossplane \
  crossplane-stable/crossplane \
  --namespace crossplane-system \
  --create-namespace \
  --version 1.19.0

# インストールの完了を待機
kubectl wait deployment -n crossplane-system crossplane \
  --for=condition=Available \
  --timeout=5m
```

### 4. AWS Route53 Providerのインストール

以下の内容で`provider.yaml`を作成します: 

```yaml
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
  name: provider-aws-route53
spec:
  package: xpkg.upbound.io/upbound/provider-aws-route53:v1.20.1
```

作成したProviderをインストールします: 

```bash
kubectl apply -f provider.yaml

# インストールの完了を待機
kubectl wait provider.pkg.crossplane.io/provider-aws-route53 \
  --for=condition=Healthy \
  --timeout=5m
```

### 5. AWS認証情報の設定

AWS認証情報をSecretとして作成します: 

```bash
kubectl create secret generic aws-secret \
  --namespace crossplane-system \
  --from-literal=credentials="[default]
aws_access_key_id = <YOUR_ACCESS_KEY>
aws_secret_access_key = <YOUR_SECRET_KEY>"
```

### 6. ProviderConfigの作成

以下の内容で`provider-config.yaml`を作成します: 

```yaml
apiVersion: aws.upbound.io/v1beta1
kind: ProviderConfig
metadata:
  name: default
spec:
  credentials:
    source: Secret
    secretRef:
      namespace: crossplane-system
      name: aws-secret
      key: credentials
```

作成したProviderConfigを適用します: 

```bash
kubectl apply -f provider-config.yaml
```

## 実際の検証手順

### 1. Route53 Zoneリソースの作成

以下の内容で`zone.yaml`を作成します: 

```yaml
apiVersion: route53.aws.upbound.io/v1beta1
kind: Zone
metadata:
  name: example-zone
spec:
  forProvider:
    name: example.test
    region: ap-northeast-1
```

注意: `.test`はRFC 6761で定義された特別用途ドメインで、検証環境に最適です。実際の運用では、自分が所有する正規のドメインを使用してください。

Zoneリソースを作成します: 

```bash
# Zoneリソースの作成
kubectl apply -f zone.yaml

# Readyの状態になるまで待機
kubectl wait zone example-zone --for=condition=Ready --timeout=5m
```

### 2. 作成されたリソースの確認

Zoneリソースの状態を確認します: 

```bash
kubectl get zone example-zone -o yaml
```

## 検証結果の詳細

### 1. external-nameの値

`metadata.annotations`の`crossplane.io/external-name`には、Route53のホストゾーンIDが格納されます: 

```yaml
metadata:
  annotations:
    crossplane.io/external-name: Z00601612X8VLNNVAI1QZ
```

このIDは、AWS Route53で作成されたホストゾーンを一意に識別する文字列です。

### 2. ネームサーバー情報

ネームサーバー情報は`status.atProvider`に2つの形式で格納されます: 

```yaml
status:
  atProvider:
    nameServers:
      - ns-1004.awsdns-61.net
      - ns-1221.awsdns-24.org
      - ns-1879.awsdns-42.co.uk
      - ns-207.awsdns-25.com
    primaryNameServer: ns-207.awsdns-25.com
```

- `nameServers`: AWSが割り当てた4つのネームサーバーの配列
- `primaryNameServer`: プライマリとして指定されたネームサーバー

### 3. ARN(Amazon Resource Name)

ARNは`status.atProvider.arn`に以下の形式で格納されます: 

```yaml
status:
  atProvider:
    arn: arn:aws:route53:::hostedzone/Z00601612X8VLNNVAI1QZ
```

### 4. ゾーンID

ゾーンIDは`status.atProvider`内の2箇所に同じ値が格納されます: 

```yaml
status:
  atProvider:
    id: Z00601612X8VLNNVAI1QZ
    zoneId: Z00601612X8VLNNVAI1QZ
```

## クリーンアップ

検証が終わったら、以下の手順でリソースを削除します: 

```bash
# Route53 Zoneの削除
kubectl delete zone example-zone

# kindクラスタの削除
kind delete cluster
```

## まとめ

CrossplaneでRoute53のZoneリソースを作成すると、様々な有用な情報が自動的に取得できることがわかりました。これらの情報は、Kubernetes上でのDNS管理や他のAWSリソースとの連携に活用できます。

特に、ネームサーバー情報が自動的に取得できる点は、DNSの設定を自動化する際に非常に便利です。また、ゾーンIDやARNも他のリソースから参照できるため、Kubernetes上でのDNS管理をより柔軟に行えます。

本稿の内容が、CrossplaneでのAWS Route53管理の参考になれば幸いです。最後までお読みいただき、ありがとうございました。