DM 変換を使用した Deployment Manager の構成の変換

このページでは、DM 変換を使用して Deployment Manager の構成を Kubernetes リソースモデル(KRM)または Terraform に変換するプロセスについて説明します。

環境を設定する

環境変数を設定する

このガイドの残りの箇所で使用するため、環境変数を保存します。

export PROJECT_ID=$(gcloud config get-value project) \
export DM_CONVERT_IMAGE="us-central1-docker.pkg.dev/\
dm-convert-host/deployment-manager/dm-convert:public-preview"

ツールを設定する

次のツールにはアクセス権が必要です。

  • gcloud

  • docker

  • kubectl

  • bq

  • jq

Cloud Shell を使用して DM 変換を実行している場合は、ツールへのアクセス権がすでにあります。

Cloud Shell で開く

構成の変換

大まかには、次の方法でDeployment Manager の構成をTerraform または KRM に移行します。

  1. 変換用の Deployment Manager のデプロイの準備。

  2. 構成を HCL(Terraform 用 HashiCorp 構成言語)または KRM(Kubernetes リソースモデル)のいずれかの形式に変換する。

  3. Terraform または Config Connector を使用して、変換された構成を適用する。

  4. 既存の Deployment Manager のデプロイを破棄する。

既存のデプロイを準備する

DM 変換は、Deployment Manager の構成ファイルとテンプレートを操作します。このガイドを通して、これらのファイルは、DM 変換ツールの入力としてローカルに作成、保存します。

構成ファイルは、手動で作成することや、実際のデプロイから取得することができます。

構成ファイルを変換する

コンバータを試すには、次のサンプル構成を使用します。PROJECT_ID を Google Cloud プロジェクト ID に置き換え、次の内容を deployment.yaml というファイルに保存します。

  resources:
  - name: bigquerydataset
    type: bigquery.v2.dataset
    properties:
      datasetReference:
        datasetId: bigquerydataset
        projectId: PROJECT_ID
      defaultTableExpirationMs: 36000000
      location: us-west1
  - type: bigquery.v2.table
    name: bigquerytable
    properties:
      datasetId: bigquerydataset
      labels:
        data-source: external
        schema-type: auto-junk
      tableReference:
        projectId: PROJECT_ID
        tableId: bigquerytable
    metadata:
      dependsOn:
      - bigquerydataset
  • ライブ デプロイメントから構成を取得する

    ライブ デプロイメントの構成を取得して変換する場合は、DEPLOYMENT_NAME をデプロイの名前に置き換えると、展開された構成を取得し、次のコマンドの実行でディスクに保存できます。

    # Configure your project/deployment
    DEPLOYMENT_NAME=DEPLOYMENT_NAME
    PROJECT_ID=PROJECT_ID
    
    # Fetch the latest manifest for the given deployment
    gcloud deployment-manager deployments describe $DEPLOYMENT_NAME \
      --project $PROJECT_ID --format="value(deployment.manifest)"
    https://www.googleapis.com/deploymentmanager/v2/projects/$PROJECT_ID/global/deployments/bq/manifests/manifest-1618872644848
    
    # The manifest name is the last path segment from the URI
    # in the above command output
    MANIFEST_NAME="manifest-1618872644848"
    # Save the expanded manifest to deployment.yaml
    gcloud deployment-manager manifests describe $MANIFEST_NAME \
      --deployment $DEPLOYMENT_NAME --project $PROJECT_ID \
      --format="value(expandedConfig)" > deployment.yaml
    

デプロイメントを変換する

deployment.yaml 内のリソースを HCL または KRM 形式に変換して変換後の出力として保存するには、目的の置換が記述された deployment.yaml と同じディレクトリで次のコマンドを実行します。

CONVERTED_RESOURCES=OUTPUT_FILE

docker run --rm -it --workdir=/convert \
--volume=$(pwd):/convert \
$DM_CONVERT_IMAGE \
--config deployment.yaml \
--output_format OUTPUT_FORMAT \
--output_file OUTPUT_FILE \
--output_tf_import_file OUTPUT_IMPORT_FILE \
--deployment_name DEPLOYMENT_NAME \
--project_id $PROJECT_ID

次のように置き換えます。

  • OUTPUT_FORMAT: 変換の出力形式。Terraform の場合は TF、KRM の場合は KRM のいずれかです。

  • OUTPUT_FILE: 変換された出力を保存するファイルの名前。

  • (Terraform のみ) OUTPUT_IMPORT_FILE: Terraform インポート コマンドが保存されるファイルの名前。project_id フラグが指定されている場合、インポート コマンドはフラグに基づいて生成されます。project_id フラグが指定されていない場合、リソース構成の projectId 属性に基づいてインポート コマンドが生成されます。

  • DEPLOYMENT_NAME: デプロイメントの名前。これは、Deployment Manager 構成でテンプレートを使用していて、deployment 環境変数も使用している場合に適切です。詳細は、環境変数の使用をご覧ください。

変換を表示する

# Print output file
cat OUTPUT_FILE

変換された構成を適用する

Terraform

Terraform の設定

# Configure default project
cat <<EOF > echo > main.tf
provider "google" {
  project = "$PROJECT_ID"
}
EOF

Deployment Manager リソースを Terraform に変換したら、変換された構成を直接デプロイすることで、Terraform を使用してリソースを作成できます。

Terraform を使用して変換された構成をデプロイする

# NOTE: if Terraform state gets corrupted during testing,
# use init --reconfigure to reset backend
terraform init
echo "***************  TERRAFORM PLAN  ******************"
terraform plan
echo "**************  TERRAFORM APPLY  ******************"
terraform apply

(省略可)既存のリソースをインポートする

既存のデプロイを変換し、Terraform を使用してリソースを再デプロイせずに管理する場合は、Terraform のインポート機能を使用できます。

このセクションでは、インポート プロセスに deployment.yaml を使用します。

Terraform を初期化します。

# NOTE: if Terraform state gets corrupted during testing,
# use init --reconfigure to reset backend
terraform init

インポート コマンドが生成され、OUTPUT_IMPORT_FILE に保存されます。その内容を確認するには、次のコマンドを実行します。

cat OUTPUT_IMPORT_FILE

deployment.yaml のリソースをインポートするには、次のコマンドを実行します。

# Make the import file executable
chmod +x OUTPUT_IMPORT_FILE
# Perform the import
./OUTPUT_IMPORT_FILE

Terraform の状態にリソースをインポートしたら、Terraform の plan コマンドを実行して、状態と生成された Terraform 構成の間に変更があるかどうかを確認できます。

terraform plan

出力は次のようになります。

Terraform will perform the following actions:

# google_bigquery_dataset.bigquerydataset will be updated in-place
~ resource "google_bigquery_dataset" "bigquerydataset" {
    ...
    ~ labels = {
        # the label value will be based on the deployment name and may not
        # match
        - "goog-dm" = "bq-for-import" -> null
      }
    ...
  }

# google_bigquery_table.bigquerytable will be updated in-place
~ resource "google_bigquery_table" "bigquerytable" {
    ...
    ~ labels = {
        # the label value will be based on the deployment name and may not
        # match
        - "goog-dm" = "bq-for-import" -> null
      }
    ...
  }

Plan: 0 to add, 2 to change, 0 to destroy.

Deployment Manager 固有のラベル(goog-dm など)が削除されるため、Terraform プランでこの変更を承認します。これらのラベルは、リソースが Terraform によって管理されるようになると不要になります。

Terraform 構成を適用するには、次のコマンドを実行します。

# Accept changes by entering yes when prompted
terraform apply

これで、deployment.yaml で定義されたすべてのリソースが Terraform の管理下に置かれます。

たとえば、Terraform が実際に変換されたリソースを管理していることを確認するには、Terraform 構成にわずかな変更を加えて、google_bigquery_dataset.bigquerydatasetリソースのデフォルトのテーブル有効期限を変更します。

...
# change from 10 hrs to 12 hrs
default_table_expiration_ms = 43200000
...

変更を加えた後、Terraform 構成を適用し、bq コマンドライン インターフェース(CLI)を使用して変更を確認できます。

# Accept changes by entering yes when prompted
terraform apply
# Access the dataset properties via bq to verify the changes
bq show --format=prettyjson bigquerydataset | jq '.defaultTableExpirationMs'

出力は、更新された Terraform 構成で指定された値と一致するはずです。これにより、Terraform がこれらのリソースを管理していることを確認できます。

KRM

Config Connector を設定する

KRM 構成ファイルのリソースをアクチュエートするには、Config Connector がインストールされた Kubernetes クラスタが必要です。テストクラスタを作成するには、GKE アドオンを使用したインストールをご覧ください。

Cloud Shell で、使用する GKE クラスタの kubectl 認証情報が構成されていることを確認します。GKE_CLUSTER はクラスタの名前に置き換えて、次のコマンドを実行します。

gcloud container clusters get-credentials GKE_CLUSTER

kubectl を使用して、変換された KRM の構成をデプロイする

kubectl を使用して変換された KRM の構成をデプロイするには、次のコマンドを実行します。

# Ensure that the namespace is annotated to create resources in the correct
# project/folder/organization. https://cloud.google.com/config-connector/docs/how-to/install-upgrade-uninstall#specify
kubectl apply -n CONFIG_CONNECTOR_NAMESPACE \
  -f OUTPUT_FILE

# Wait for the resources to become healthy
kubectl wait -n CONFIG_CONNECTOR_NAMESPACE \
  --for=condition=Ready \
  --timeout=5m -f OUTPUT_FILE

クリーンアップ

サンプルのデータセットとテーブルをクリーンアップする

Terraform

# NOTE: if Terraform state gets corrupted during testing,
# use init --reconfigure to reset backend
echo "***************  TERRAFORM INIT  ******************"
terraform init
# Remove delete protection on BigQuery table
sed -i "/resource \"google_bigquery_table\"/a deletion_protection=\"false\"" \
OUTPUT_FILE
terraform apply
echo "***************  TERRAFORM DESTROY ****************"
terraform destroy

KRM

サンプル構成から BigQuery のデータセットとテーブルをクリーンアップするには、次のコマンドを実行します。

# If the resource was created via Config Connector:
kubectl delete -n CONFIG_CONNECTOR_NAMESPACE \
  -f OUTPUT_FILE

サンプルの Deployment Manager のデプロイを破棄する

KRM または Terraform に正常に変換されたライブ デプロイメントを破棄する場合は、次のコマンドを実行します。

gcloud deployment-manager deployments delete DEPLOYMENT_NAME --delete-policy ABANDON

変換でサポートされているリソース

Terraform

Terraform でサポートされているリソースを一覧表示するには、次のコマンドを実行します。

docker run --rm -it \
us-central1-docker.pkg.dev/dm-convert-host/deployment-manager/dm-convert:public-preview \
--output_format tf \
--list_supported_types

KRM

KRM でサポートされているリソースを一覧表示するには、次のコマンドを実行します。

docker run --rm -it \
us-central1-docker.pkg.dev/dm-convert-host/deployment-manager/dm-convert:public-preview \
--output_format krm \
--list_supported_types

次のステップ

変換された構成のベスト プラクティスと推奨事項を確認する。