Відповіді:
Не зовсім. Типовий спосіб подолати це, наприклад, використовувати:
terraform apply -target=aws_security_group.my_sg
але це застосовуватиметься лише одна група безпеки одночасно, тому ви будете нудною, якщо їх буде багато. Однак можна націлити кілька ресурсів в одній команді:
terraform apply -target=aws_security_group.my_sg -target=aws_security_group.my_2nd_sg
Однак, можливо, існує декілька способів вирішення:
-target
Параметр поважає залежності.
Це означає, якби ви були, наприклад. -target=aws_instance.my_server
і цей екземпляр мав, скажімо, п'ять груп безпеки, приєднаних до нього за допомогою інтерполяції, зміни до цих груп безпеки повинні бути включені в план (я не ретельно перевіряв це, але я вважаю, що це працює).
Це трохи безладно, оскільки, напевно, ви не хочете торкатися екземпляра. Більш безпечною альтернативою може бути використання чогось типу a, null_resource
щоб вказати ціль для груп безпеки, але я знову не намагався цього (можливо, є ще один "безпечний" ресурс, на який можна покластися?).
Створіть модуль.
Ви можете орієнтуватися на модуль так само, як і на звичайний ресурс:
terraform apply -target=module.my_security_groups
Всередині цього модуля ви можете визначити всі ваші групи безпеки - так само, як і у вас поза модулем. Окрім того, що ви можете націлити його безпосередньо, це також полегшує повторне використання того ж набору груп безпеки для іншої інфраструктури, якщо вам це буде потрібно.
Використання модуля Terraform є кращим, але якщо вам дійсно потрібно запустити terraform застосувати до одного файлу, я створив цей скрипт bash для створення команди Terraform застосовувати проти всіх цілей і модулів в одному файлі:
#!/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"
Я насправді не баш експерт, але це було тестовано для роботи на Mac.
EDIT: Команда sed передбачає, що ресурси та модулі добре відформатовані відповідно до terraform fmt
:
resource "aws_eip" "my_public_ip" {
}
resource "aws_instance" "my_server" {
}
module "my_module" {
}