Terraform:1つのtfファイルのみを適用します


16

securitygroup.tfファイルにセキュリティグループがあります。

同じディレクトリに、他のリソースの説明(rds、ec2など)がたくさんあります。

terraform apply --auto-approve だけのために実行する方法はありsecuritygroups.tfますか?

回答:


18

あんまり。ただし、これを回避する標準的な方法は、たとえば次のようにすることです。

terraform apply -target=aws_security_group.my_sg

ただし、セキュリティグループは一度に1つしか適用されないため、多くのセキュリティグループがある場合は退屈になります。ただし、1つのコマンドで複数のリソースをターゲットにできます。

terraform apply -target=aws_security_group.my_sg -target=aws_security_group.my_2nd_sg

ただし、2つの回避策が潜在的にあります。

  • -targetパラメータは、依存関係を尊重しています。

    これは、たとえば -target=aws_instance.my_serverそのインスタンスには、たとえば、補間によって5つのセキュリティグループが接続されていたため、それらのセキュリティグループへの変更を計画に含める必要があります(これを完全にテストしたことはありませんが、これが機能する方法だと思います)。

    ただし、インスタンスに触れたくないので、これは少し面倒です。より安全な代替策はnull_resource、セキュリティグループのターゲットを提供するためにaのようなものを使用することかもしれませんが、私はこれを試していません(ただし、信頼できる別の「安全な」リソースがあるかもしれません?)。

  • モジュールを作成します。

    プレーンリソースをターゲットにできるのと同じように、モジュールをターゲットにできます。

    terraform apply -target=module.my_security_groups
    

    このモジュール内では、モジュールの外部にあるのと同じように、すべてのセキュリティグループを定義できます。直接ターゲットにできることに加えて、これにより、必要に応じて、他のインフラストラクチャに同じセキュリティグループのセットを再利用しやすくなります。


2

モジュールごとにコードを整理する場合、テラフォームをモジュールにのみ適用できます。例:

# securitygroup.tf
module "securitygroup" {
  source = "git@github.com:user/securitygroup-terraform-module.git?ref=master"
}

$ tf apply -target=module.securitygroup

1

可能だとは思えません。構成ファイルをロードするコードは次のとおりです。現在のディレクトリ(または指定したディレクトリ)からすべての* .tfファイルをロードしますが、構成を1つのファイルに制限するものはありません。


0

terraformモジュールを使用することをお勧めしますが、本当に1つのファイルに対してterraform applyを実行する必要がある場合は、このbashスクリプトを作成して、1つのファイル内のすべてのターゲットとモジュールに対してterraform applyコマンドを生成します。

#!/usr/bin/env bash
if [[ -z "$@" ]]; then
  echo "Missing file input arguments"
  exit 1
fi

echo "terraform apply \\"
for FILE in "$@"
do
  RESOURCE=$(sed -n 's/resource "\([^"]*\)" "\([^"]*\)".*/-target=\1.\2 \\/gp' $FILE)
  MODULE=$(sed -n 's/module "\([^"]*\)".*/-target=module.\1 \\/gp' $FILE)
  if [[ -z "$RESOURCE" ]] && [[ -z "$MODULE" ]]; then
    echo "Cannot detect terraform resource and module in $FILE"
    exit 1
  fi

  if [[ ! -z "$RESOURCE" ]]; then
    echo -e $"$RESOURCE"
  fi
  if [[ ! -z "$MODULE" ]]; then
    echo -e $"$MODULE"
  fi
done
echo "-refresh=true"

私は本当にbashの専門家ではありませんが、Macで動作するようにテストされています。

編集:sedコマンドは、次のようにリソースとモジュールが適切にフォーマットされていることを前提としていますterraform fmt

resource "aws_eip" "my_public_ip" {
}

resource "aws_instance" "my_server" {
}

module "my_module" {
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.