コードとしてのインフラストラクチャ (IaC) を扱うソフトウェア プロフェッショナルとして、あなたは多くの作業を行っている可能性があります。
その状態ファイルを S3 バケットに保存し、DynamoDB を使用してロック状態を管理できることに注意してください。ただし、このアプローチでは追加のリソースを作成する必要があり、特にクライアントが GitLab を使用している場合は複雑なオプションになります。 GitLab は最近、Terraform の状態を保存および管理する方法と、その周りに CI をセットアップする簡単な方法を提供することで、Terraform の統合への参入障壁を下げました。
このブログ投稿では、Terraform 状態ファイルとは何か、GitLab に移行する方法、CI パイプラインを設定する方法について説明します。リポジトリにアクセスできます
Terraform は、状態ファイルを介して、コードで定義されたインフラストラクチャに関するすべての情報を記録します。 JSON で記述され、基本的に、Terraform コードから作成された実際のリソースへのマッピングを記録します。以下は、terraform.tfstate がどのように見えるかの例です。
主に、Terraform を実行するたびに、EC2 インスタンスの最新のステータスが取得され、Terraform 構成と比較されて、適用する必要がある変更が決定されます。
{ "version": 4, "terraform_version": "0.12.0", "serial": 1, "lineage": "1f2087f9-4b3c-1b66-65db-8b78faafc6fb", "outputs": {}, "resources": [ { "mode": "managed", "type": "aws_instance", "name": "example", "provider": "provider.aws", "instances": [ { "schema_version": 1, "attributes": { "ami": "ami-0c55b159cbfafe1f0", "availability_zone": "us-west-2a", "id": "i-00a123a0accffffff", "instance_state": "running", "instance_type": "t2.micro", "(...)": "(truncated)" } } ] } ] }
デフォルトでは、この terraform.tfstate は、Terraform ファイルがある場所にローカルに保存され、変更を計画して適用します。いくつかのテストを実行するだけの個人的なプロジェクトの場合、これは問題ありませんが、推奨される方法ではありません。理由は次のとおりです。
Terraform がクラウド インフラストラクチャ プロビジョニングの標準と見なされているため、GitLab が Terraform の状態を保存および管理する方法を提供し始めてから 1 年ほどが経ちました。このため、最近 GitLab を使用して IaC を管理し始めたので、移行プロセスを共有したいと思いました。
この記事では、ローカル状態を使用していて、AWS S3 バケットまたは別のバックエンド ソリューションで状態を管理していると想定しています。
まず、HTTP を使用するように backend.tf を変更する必要があります。
terraform { backend "http" {} }
次に、ターミナルで 4 つの変数を設定する必要があります。
__ __
PROJECT_ID="28450092" TF_USERNAME="florianpialoux" TF_PASSWORD="123456789" TF_ADDRESS="https://gitlab.com/api/v4/projects/${PROJECT_ID}/terraform/state/aws-buckets"
次のコマンドを使用して、Terraform の状態を以前の場所から GitLab に移動する移行コマンドを実行できます。
terraform init \ -migrate-state \ -backend-config=address=${TF_ADDRESS} \ -backend-config=lock_address=${TF_ADDRESS}/lock \ -backend-config=unlock_address=${TF_ADDRESS}/lock \ -backend-config=username=${TF_USERNAME} \ -backend-config=password=${TF_PASSWORD} \ -backend-config=lock_method=POST \ -backend-config=unlock_method=DELETE \ -backend-config=retry_wait_min=5
GitLab が状態ファイルの管理を開始できるように、「はい」で確認を行う必要があります。ローカル状態から GitLab への例を次に示します。
__ __
s3 から GitLab への例
__ __
これで、GitLab インターフェイスからInfrastructure > Terraformに移動して、状態を確認できます。
__ __
以前に実行した migrate-state コマンドを使用した後でも、s3 から持っていた状態ファイルの一部が空白になることに気付きました。この場合、これを実行できます。
terraform state pull > aws-buckets.json
s3 状態からコンテンツをコピーして貼り付け、プッシュを実行します。
terraform state push -lock=true aws-buckets.json
GitLab は Terraform 状態ファイルのバージョン管理をサポートしていますが、WebUI を介して古いバージョンを表示/復元するには、
GitLab が提供する
terraform 適用ジョブが実行されると、状態がいつ、どのパイプラインで使用されたかを確認できます。
__ __
gitlab-ci.ymlがどのように見えるかについて詳しく知る
__ __
お気づきかもしれませんが、追加した gitlab-ci.yaml を見てください。
Terraform の状態と CI を Gitlab で実行することは、GitOps のベスト プラクティスに従うための優れた方法です。どちらも、IaC の開発と展開に最適な組み合わせです。ほとんどの人はすでにリポジトリに GitLab を使用している可能性があるため、IaC を 1 つの屋根の下に配置し、GitLab に転送中および保管中の暗号化をサポートすることで Terraform の状態を管理させ、バージョニング、ロック、およびロック解除を行うことがはるかに簡単になります。州。
ここにも掲載されています。