Вопрос или проблема
Описание
У меня есть VPC с 2 публичными подсетями и 2 приватными подсетями в EC2 VPC. Я пытаюсь отфильтровать декларацию data.aws_subnets
только до публичных подсетей, используя фильтр по тегам согласно документации. Это работает как задумано, когда значение “public”, но не работает, когда значение фильтра тегов “Public”.
Я пытаюсь выяснить, почему это происходит и является ли “Public” зарезервированным словом для Terraform или AWS.
Terraform
data "aws_vpc" "env_default" {
cidr_block = var.default_vpc_cidr[var.env_name]
}
data "aws_subnets" "public_subnets" {
filter {
name = "vpc-id"
values = [data.aws_vpc.env_default.id]
}
tags = {
Tier = "Public"
}
}
data "aws_subnets" "private_subnets" {
filter {
name = "vpc-id"
values = [data.aws_vpc.env_default.id]
}
tags = {
Tier = "Private"
}
}
Вывод консоли
> module.defaults.test_3
{
"filter" = toset([
{
"name" = "vpc-id"
"values" = toset([
"vpc-0a017736383e3fb28",
])
},
])
"id" = "us-west-2"
"ids" = tolist([
"subnet-0374050527a12267f",
"subnet-00c787547c5ee8a08",
])
"tags" = tomap({
"Tier" = "Private"
})
"timeouts" = null /* объект */
}
> module.defaults.test_2
{
"filter" = toset([
{
"name" = "vpc-id"
"values" = toset([
"vpc-0a017736383e3fb28",
])
},
])
"id" = "us-west-2"
"ids" = tolist([
"subnet-0374050527a12267f",
"subnet-0ea230b36bf53ffa5",
"subnet-00c787547c5ee8a08",
"subnet-0b40a33beb489cae5",
])
"tags" = tomap(null) /* строка */
"timeouts" = null /* объект */
}
Ответ или решение
Вопрос, который вы поднимаете, касается фильтрации подсетей в AWS с использованием тэгов в Terraform, и вы заметили, что значение "Public" не работает так, как ожидалось, в отличие от "public". Рассмотрим несколько наиболее вероятных причин этой проблемы и дам рекомендации по ее решению.
Причины проблемы
-
Чувствительность к регистру:
В AWS и Terraform теги различают регистр. Это означает, что "Public" и "public" воспринимаются как разные значения. Убедитесь, что в ваших подсетях действительно установлены теги именно с таким регистром, который вы используете в коде. Можете проверить это в AWS Management Console. -
Неправильное назначение тегов:
Возможно, вы забыли назначить тег "Tier" со значением "Public" на ваши публичные подсети. Вы можете использовать AWS CLI или AWS Management Console, чтобы убедиться, что эти теги действительно применяются к вашим ресурсам. -
Кеширование данных:
Если вы недавно изменили теги или создавали новые подсети, обратите внимание, что Terraform может кешировать данные. Для решения этой проблемы выполните командуterraform refresh
, чтобы обновить состояние кэша.
Рекомендации по решению проблемы
-
Проверьте и обновите теги:
Убедитесь, что у вас есть подсети с правильными тегами. Если ваши публичные подсети имеют тег "Tier" со значением "public", измените ваш код на следующее:data "aws_subnets" "public_subnets" { filter { name = "vpc-id" values = [data.aws_vpc.env_default.id] } tags = { Tier = "public" # Изменено с "Public" на "public" } }
-
Проверьте консоль AWS:
Используйте AWS Management Console, чтобы проверить текущее состояние тегов ваших подсетей. Убедитесь, что они соответствуют тем, которые вы используете в Terraform. -
Перепроверьте ваш код:
Убедитесь, что код Terraform не выдает ошибок при применении, и все зависимости правильно настроены. После внесения изменений запуститеterraform apply
, чтобы проверить, работает ли фильтрация как ожидалось.
Заключение
Проблема с фильтрацией данных по тегам в Terraform часто связана с неправильной настройкой тегов или их регистром. Убедитесь, что текущее состояние ваших подсетей соответствует вашим ожиданиям, и внесите необходимые изменения в код Terraform. Если после этих шагов проблема не разрешится, рекомендуется детально просмотреть вывод terraform apply
на наличие других возможных ошибок или предупреждений.