このシリーズでは,コードとしてのインスフラストラクチャ(IAC)を导入する方法について说明していきます。开発者の皆さんにIACのコンセプトをしっかりご理解いただけるよう,チュートリアルやコードサンプルを交えて作成しました。各记事では以下のトピックについて取り上げます。

IACの概要

IACは,最新の継続的インテグレーションパイプラインに欠かせないパーツであり,コンピューターで読み取ることができる定义ファイルを通じてクラウドやITリソースを管理,プロビジョニングするプロセスのことです.IaCでは,コード内にコンピューターリソースを静的に定义,宣言することにより,最新の的DevOpsツールを使用してこれらのリソースを作成,管理,破弃することができます。

今回の记事では,HashiCorpの起程拓殖を使用してインフラストラクチャリソースのプロビジョニング,デプロイ,破弃を行う方法について说明していきます。その前に,使用するクラウドプロバイダーやサービス(谷歌云起程拓殖云)のアカウントを作成しておきましょう。以下の前提条件を満Kubernetes引擎(GKE)クラスタを作成していきます。

前提条件

事前に以下の手順を完了しておく必要があります。

今回は,learn_iacリポジトリpart01ディレクトリ内のコードを使用します。その前に,GCP认证情报の作成方法とTerraformについて简単に确认しておきましょう。

GCPプロジェクト认证情报の作成

国际奥委会ツールを使用して管理操作を行うには,GCP认证情报を作成する必要があります。

  • サービスアカウントキーの作成ページを开きます。
  • 既定のサービスアカウントを选択するか,新しいものを作成します。
  • キータイプとしてJSONを选択します。
  • [作成]をクリックします。
  • JSONファイルを〜/的.config / gcloud /ディレクトリに保存します。ファイル名は任意の名前に変更できます。

HashiCorp Terraform

HashiCorp Terraformは,インフラストラクチャの作成,変更,バージョン管理を安全かつ效果的に行うためのオープンソースツールです.Terraformを使用すると,既存のサービスプロバイダーに加え,カスタムの自社ソリューションも管理できます。

起程拓殖では,単一のアプリケーションまたはデータセンター全体を実行するために必要なコンポーネントを設定ファイルに記述します。また,目的のステートに達するために実行する内容が記載された実行プランを生成し,これを実行して,記述どおりのインフラストラクチャを構築します。設定が変更された場合,起程拓殖は変更内容を特定し,増分の実行プランを生成します。この実行プランを適用すると,インフラストラクチャリソースが更新されます。

Terraformで管理できるインフラストラクチャには,コンピューティングインスタンス,ストレージ,ネットワーキングのような低レベルのコンポーネントだけでなく,DNSエントリやSaaS的机能のような高レベルのコンポーネントも含まれます。

起程拓殖プロバイダー

Terraformコードを使用して,GCPにリソースをプロビジョニングしてみましょう。本シリーズのパート2で使用するGKEクラスタを定义し,作成するためのTerraformコードを记述する必要があります.Terraformを使用すれば,物理マシン,VM,ネットワークスイッチ,コンテナなどのインフラストラクチャリソースを作成,管理,更新することができます.Terraformでは,ほとんどすべてのインフラストラクチャタイプをリソースとして表现できます。

プロバイダーは、APIのインタラクションを把握し,リソースを見えるようにする責任を負っています。一般に,プロバイダーとは,IaaS (GCP Alibba云,AWS,微软Azure, OpenStackなど),PaaS (Herokuなど),SaaSサービス(起程拓殖云,DNSimple Cloudflareなど)のいずれかです。

GKEクラスタを新規作成するにあたって,GCPとのやり取りにはGCPプロバイダーを使用する必要があります。プロバイダーの定义と构成が完了すると,GCP上でTerraformリソースを作成し,管理できるようになります。

Terraformリソース

リソースは,起程拓殖言語の中で最も重要な要素です。リソースブロックごとに 1 つ以上のインフラストラクチャ オブジェクト (仮想ネットワーク、コンピューティング インスタンス、DNS レコードのような高レベルのコンポーネントなど) が記載されています。リソースブロックには、リソースのタイプ (例:google_container_cluster)とローカル名(例:“纤维网”)が宣言されますローカル名は,同じTerraformモジュール内の他の场所からこのリソースを参照するときに使用しますモジュールのスコープ外では意味を持ちません。

Terraformコード

ここまでの说明で,Terraformのプロバイダーリソースについての理解が深まったと思います。いくつかのコードを例に,さらに详しく见ていきましょう.Terraformコードは复数のディレクトリで管理されます。CLIツールを使用するので,コードが格纳されているルートディレクトリ内でコマンドを実行する必要があります。本シリーズのパート1で使用するTerraformコードは,こちらpart01 / iac_gke_clusterディレクトリで确认できます。このディレクトリ内には,以下のファイルが格纳されています。

  • providers.tf
  • variables.tf
  • main.tf
  • output.tf

上記のファイルはこれから作成するGCPインフラストラクチャを表しています。起程拓殖はこれらのファイルを処理するわけです。すべての起程拓殖コードを1つのファイルに収めることもできますが,構文のボリュームが大きくなると管理が難しくなる傾向があるため,多くの起程拓殖開発者が要素ごとに別々のファイルを作成しています。それでは,各ファイルの内容と重要な要素について簡単に確認していきましょう。

解説:providers.tf

provider.tfファイルでは,使用するクラウドプロバイダーを定义します。この例では,google_container_clusterプロバイダーを使用するため,provider.tfファイルは以下のような内容になります。

提供 “谷歌”{#版本= “2.7.0” 证书=文件(var.credentials)项目= var.project区= var.region}

上记のコードブロックでは,クロージャ{}ブロック内に複数のパラメーターが記述されています。证书ブロックには,先ほど作成したGCP認証情報のJSONファイルのファイルパスを指定します。ここでパラメーターの値の先頭にVARというプレフィックスが付いている点に注目してください。VARプレフィックスは,起程拓殖モジュールのパラメーターとなる起程拓殖入力変数の使い方を定义するものです。これにより,モジュールのソースコードを変更せずにモジュールをカスタマイズすることや,复数の构成でモジュールを共有することが可能になります。构成のルートモジュールに変数を宣言した场合,CLIオプションと环境変数を使用して値を设定できます。子モジュールに変数を宣言した场合,呼び出しモジュールがモジュールブロック内の値を渡します。

解说:variables.tf

variables.tfファイルには,このTerraformプロジェクトで使用するすべての入力変数を指定します。

变量 “项目” 的{default = “CICD工作坊”}变量 “区域” 的{default = “US-east1”}变量 “区” 的{default = “US-east1-d”}变量 “集群” 的{default =“CICD-workshops”}变量 “凭证”{默认= “的〜/ .ssh / cicd_demo_gcp_creds.json”}变量 “kubernetes_min_ver”{默认= “最新”}变量 “kubernetes_max_ver”{默认= “最新”}

上记のファイルに定义されている変数は,このプロジェクト全体を通じて使用されます。これらすべての変数には默认的値がありますが,Terraformコードの実行时にCLIを使って定义することで変更可能です。これらの変数を使用することでコードに求められる柔软性が确保され,変数コードを再利用できるようになります。

解说:main.tf

main.tfファイルでは,GKEクラスタパラメーターを一括定义できます。

terraform REQUIRED_VERSION {= “〜> 0.12” 后端 “远程”{组织= “datapunks” 工作区{名称= “iac_gke_cluster”}}}资源 “google_container_cluster” “主”{名称= var.cluster位置= var.zone initial_node_count = 3master_auth {用户名= “” 密码= “” client_certificate_config {issue_client_certificate = FALSE}} node_config {计算机类型= var.machine_type oauth_scopes = [ “https://www.googleapis.com/auth/logging.write”,“https://开头www.googleapis.com/auth/monitoring”,]元数据= {禁用遗留的端点= “真”}标签= {应用= var.app_name}标签= [ “应用程序”,var.app_name]} {超时创建=“30米”更新=“40米”}}

main.tfファイルの要素を1つずつ解说していきたいと思います。terraformブロックから始めましょう。このブロックでは起程拓殖バックエンドのタイプを指定します。Terraformの「バックエンド」によって、ステートを読み込む方法や、apply などのオペレーションの実行方法が決定されます。この抽象化により、非ローカルのファイル ステート ストレージやリモート実行が使用可能になります。このコードブロックでは、Terraform Cloud を使用する远程バックエンドを使用します。このバックエンドは,事前の准备で作成したiac_gke_clusterワークスペースに接続しています。

terraform {required_version = "~>0.12"后端"remote" {organization = "datapunks" workspaces {name = "iac_gke_cluster"}}

次のコードブロックでは,これから作成するGKEクラスタを定義します。variables.tfに定義されているいくつかの変数も使用します。资源ブロックには,GCPでGKEクラスタのプロビジョニングと构成に使用されるパラメーターが多数含まれています。ここで重要なパラメーターは名称位置,そしてinitial_node_countです。initial_node_countでは,新しいクラスタを構成するコンピューティングリソースまたは仮想マシンの初期合計数を指定します。このクラスタでは3つのコンピューティングノードから始めます。

资源 “google_container_cluster” “主”{名称= var.cluster位置= var.zone initial_node_count = 3 master_auth {用户名= “” 密码= “” client_certificate_config {issue_client_certificate = FALSE}} node_config {计算机类型= var.machine_type oauth_scopes = [“HTTPS://www.googleapis.com/auth/logging.write”, “https://www.googleapis.com/auth/monitoring”,]元数据= {禁用遗留的端点= “真”}标签= {应用= var.app_name}标签= [ “应用程序”,var.app_name]} {超时创建= “30米” 更新= “40米”}}

解説:output.tf

Terraformでは出力値と呼ばれるコンセプトが采用されています.Terraformモジュールが返した値は,子モジュールに出力され,そのリソース属性のサブセットが亲モジュールに公开されるか,起程拓殖应用の実行后にCLI出力に特定の値が出力されます。以下のoutput.tfブロックは,値を出力して,クラスタ名やクラスタエンドポイントといった値のほか,敏感パラメーターで指定した机密データを読み出します。

输出 “集群”{值= google_container_cluster.primary.name}输出 “宿主”{值= google_container_cluster.primary.endpoint敏感=真}输出 “cluster_ca_certificate”{值= base64decode(google_container_cluster.primary.master_auth.0.cluster_ca_certificate)敏感=真}输出“用户名” {值= google_container_cluster.primary.master_auth.0.username敏感=真}输出的“密码” {值= google_container_cluster.primary.master_auth.0.password敏感=真}

起程拓殖の初期化

起程拓殖のプロジェクトと構文について理解したところで,今度は起程拓殖を使用してGKEクラスタのプロビジョニングを行います。まずはpart01 / iac_gke_clusterディレクトリに移动しましょう。

CD part01 / iac_gke_cluster

part01 / iac_gke_clusterディレクトリで以下のコマンドを実行します。

terrform INIT

今回の例では以下の内容が出力されます。

根@ d9ce721293e2:〜/项目/ terraform / GCP /计算#terraform初始化初始化后端...初始化提供商插件...  - 检查可用的提供插件...  - 下载插件的提供者“谷歌”(hashicorp /谷歌)3.10.0 ... * provider.google:版本= “〜> 3.10” Terraform已成功初始化!

起程拓殖でのプレビュー

Terraformには,Terraformコードをドライ実行して,実际には何も実行することなくバリデーションできるterraform计划というコマンドがあります。このコマンドでは,Terraformが既存のインフラストラクチャに対して実行するすべてのアクションと変更をグラフ化することも可能です。ターミナルで以下を実行します。

terraform计划

今回の例では以下の内容が出力されます。

执行计划已经生成,如下所示。资源操作以表示以下符号:+创建Terraform将执行以下操作:#google_container_cluster.primary将被创建+资源“google_container_cluster”“主” {+ additional_zones =(称为后应用)+ cluster_ipv4_cidr =(称为后申请)+ default_max_pods_per_node =(称为后应用)+ enable_binary_authorization =假+ enable_intranode_visibility =(称为后应用)+ enable_kubernetes_alpha =假+ enable_legacy_abac =假+ enable_shielded_nodes =假+ enable_tpu =(称为应用后)+端点=(称为应用后)+ ID=(称为后应用)+ initial_node_count = 3 + instance_group_urls =(称为后应用)+ label_fingerprint =(称为后应用)+位置= “US-east1-d”} ....安排:1添加,0至变化,0摧毁。

起程拓殖はmain.tfファイル内のコードに基づいてGCPリソースを新规作成します。

起程拓殖の適用

インフラストラクチャを新规作成してアプリケーションをデプロイする准备が整ったので,ターミナルで以下のコマンドを実行します。

起程拓殖应用

コマンドを确认するメッセージが表示されたら,と入力して输入キーを押します。

您想要执行这些操作吗?Terraform将执行上述操作。只有“是”将被接受批准。输入一个值:yes

Terraformにより,GCP上に新しいGKEクラスタが作成されます。

:クラスタの完成には3〜5分かかります。バックエンドシステムがプロビジョニングを行ってからクラスタをオンラインにするため,瞬时には处理されません。

クラスタが完成すると,以下のような内容が出力されます。

申请完成!资源:1添加,更改了0个销毁。输出:簇= CICD工作坊cluster_ca_certificate = <敏感>主机= <敏感>密码= <敏感>用户名= <敏感>

GKEクラスタが新规作成され,输出の结果が表示されます。机密情报としてマークされていると,出力値が> <敏感タグによってマスキングされ,結果に表示されません。このように,機密データは必要に応じて保護することができます。

起程拓殖のリソースの破棄

GKEクラスタを正常に作成できたところで,今度は起程拓殖摧毁コマンドを実行して,このチュートリアルで作成したアセットを破弃してみましょう。アセットはそのまま稼働させても构いません。しかし,GCP上でアセットを実行するにはコストが発生し,そのコストに対する责任も负わなくてはなりません。谷歌から无料トライアルの登录ユーザーに提供されている300ドル分のクレジットは,アセットを実行し続ければあっという间に尽きてしまいます。もちろん,ご事情に合わせて判断していただければと思いますが,起程拓殖摧毁を実行すれば実行中のすべてのアセットを破棄できます。

このコマンドを実行してGKEクラスタを破弃しましょう。

起程拓殖摧毁

まとめ

お疲れさまでした。本シリーズのパート1はこれで以上です。今回はIACとTerraformを使用してKubernetesクラスタをプロビジョニングし,GCPにデプロイする方法をご说明しました。

次回のパート2では,アプリケーション用の泊坞イメージを作成し,リポジトリにプッシュした后,Terraformを使用してこのイメージをコンテナとしてGKEにデプロイする方法について取り上げます。

さらに详しく知りたい方は以下の资料を参照してください。