#amazon-web-services #terraform #terragrunt
#amazon-web-services #terraform #terragrunt
Вопрос:
Я не могу заставить это работать. Мне нужно установить переменную AWS_PROFILE
среды, чтобы заставить terragrunt работать правильно. Если я запущу:
export AWS_PROFILE=myprofile; terragrunt plan
Это сработает, но это не то, что мне нужно, я хочу просто запустить:
terragrunt plan
и пусть этот автоматический выбор правильного профиля aws, который я должен использовать. Вот что у меня есть:
generate "provider" {
path = "provider.tf"
if_exists = "overwrite_terragrunt"
contents = <<EOF
provider "aws" {
region = "${local.region}"
profile = "${trimspace(run_cmd("bash", "${get_parent_terragrunt_dir()}/../../set_profile.sh",local.profile))}"
}
EOF
}
remote_state {
backend = "s3"
generate = {
path = "backend.tf"
if_exists = "overwrite"
}
config = {
...
...
region = local.region
profile = local.profile
...
...
}
}
Он всегда выдает мне ошибку:
Error finding AWS credentials (did you set the AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY environment variables?): NoCredentialProviders: no valid providers in chain. Deprecated.
For verbose messaging see aws.Config.CredentialsChainVerboseErrors
set_profile.sh
Сценарий выглядит следующим образом:
#!/bin/bash
VALUE=$(echo $1 | sed $'s/r//')
export AWS_PROFILE=$VALUE
echo "$AWS_PROFILE"
Если я повторяю свое AWS_PROFILE
, оно все еще пустое. Таким образом, команда run фактически не сохраняет значение экспорта на моей консоли.
Что я делаю не так? Кто-нибудь действительно успешно смог динамически устанавливать их AWS_PROFILE
с помощью terragrunt?
Комментарии:
1. Может быть не связано, но убедитесь, что вы очищаете кэш terragrunt между запусками при внесении изменений в конфигурации поставщика
2. К сожалению, кубиков нет. Я очистил свой
.terragrunt-cache
каталог. Повторно запустил план terragrunt с той же ошибкой и все равно получил пустой результат сecho $AWS_PROFILE
3. О, подождите. Я удалил строку, указывающую мой профиль в серверной части s3. Я добавил его снова, снова очистил кешем, и теперь он работает. Я думаю, это было так!
Ответ №1:
Этот пост помог мне разобраться в моей проблеме:
Я забыл о том факте, что в моей конфигурации есть 2 подключения AWS к настройке
- серверная часть
- поставщик услуг
Следовательно, профиль AWS пришлось устанавливать дважды:
- в
remote_state
remote_state { backend = "s3" config = { ... profile = local.profile ... } }
- в
provider.tf
generate "provider" { path = "provider.tf" if_exists = "skip" contents = <<EOF provider "aws" { ... profile = "${local.profile}" ... } EOF }
Надеюсь, это сэкономит кому-то все время, которое я потратил впустую сегодня!
Ответ №2:
Это мое решение. У меня следующая структура:
<project>
|-- <region1>
|-- <region2>
|-- account.hcl
terragrunt.hcl
В account.hcl
locals {
aws_profile_name = "myprofile"
}
В основном terragrunt.hcl
locals {
# Automatically load account-level variables
account_vars = read_terragrunt_config(find_in_parent_folders("account.hcl"))
aws_profile = local.account_vars.locals.aws_profile_name
}
terraform {
extra_arguments "aws_profile" {
commands = [
"init",
"apply",
"refresh",
"import",
"plan",
"taint",
"untaint"
]
env_vars = {
AWS_PROFILE = "${local.aws_profile}"
}
}
}
remote_state {
...
config = {
...
profile = "${local.aws_profile}"
}
}
generate "provider" {
...
contents
contents = <<EOF
provider "aws" {
profile = "${local.aws_profile}"
}
EOF
}
...