回答:
あんまり。ただし、これを回避する標準的な方法は、たとえば次のようにすることです。
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
このモジュール内では、モジュールの外部にあるのと同じように、すべてのセキュリティグループを定義できます。直接ターゲットにできることに加えて、これにより、必要に応じて、他のインフラストラクチャに同じセキュリティグループのセットを再利用しやすくなります。
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" {
}