Фон:
Я использую AWS CodeBuild buildspec.yml для перебора каталогов из репозитория GitHub для применения IaC с использованием Terraform. Чтобы получить доступ к учетным данным, необходимым для провайдера Terraform AWS, я использовал хранилище параметров системного менеджера AWS, чтобы получить доступ и секретный ключ в buildspec.yml.
Проблема:
Хранилище параметров системного менеджера маскирует значение env доступа и секретного ключа, поэтому, когда они унаследованы поставщиком Terraform AWS, поставщик выводит, что учетные данные недействительны:
Error: error configuring Terraform AWS Provider: error validating provider credentials: error calling sts:GetCallerIdentity: InvalidClientTokenId: The security token included in the request is invalid.
status code: 403, request id: xxxx
Чтобы воспроизвести проблему:
Создать переменные хранилища параметров системного менеджера (TF_VAR_AWS_ACCESS_KEY_ID = доступ, TF_AWS_SECRET_ACCESS_KEY = секрет)
Создайте проект AWS CodeBuild с помощью:
"source": {
"type": "NO_SOURCE",
}
"environment": {
"type": "LINUX_CONTAINER",
"image": "aws/codebuild/standard:4.0",
"computeType": "BUILD_GENERAL1_SMALL"
}
buildspec.yml
со следующим: (изменено для создания файлов .tf вместо получения из github)
version: 0.2
env:
shell: bash
parameter-store:
TF_VAR_AWS_ACCESS_KEY_ID: TF_AWS_ACCESS_KEY_ID
TF_VAR_AWS_SECRET_ACCESS_KEY: TF_AWS_SECRET_ACCESS_KEY
phases:
install:
commands:
- wget https://releases.hashicorp.com/terraform/0.12.28/terraform_0.12.28_linux_amd64.zip -q
- unzip terraform_0.12.28_linux_amd64.zip && mv terraform /usr/local/bin/
- printf "provider "aws" {\n\taccess_key = var.AWS_ACCESS_KEY_ID\n\tsecret_key = var.AWS_SECRET_ACCESS_KEY\n\tversion = \"~> 3.2.0\"\n}" >> provider.tf
- printf "variable "AWS_ACCESS_KEY_ID" {}\nvariable "AWS_SECRET_ACCESS_KEY" {}" > vars.tf
- printf "resource \"aws_s3_bucket\" \"test\" {\n\tbucket = \"test\"\n\tacl = \"private\"\n}" >> s3.tf
- terraform init
- terraform plan
Попытки:
- Передача кредитов через параметр terraform
-vars
:
terraform plan -var="AWS_ACCESS_KEY_ID=$TF_VAR_AWS_ACCESS_KEY_ID" -var="AWS_ACCESS_KEY_ID=$TF_VAR_AWS_SECRET_ACCESS_KEY"
но я получаю ту же ошибку неверных учетных данных
- Учетные данные хранилища параметров диспетчера системы экспорта в buildspec.yml:
commands:
- export AWS_ACCESS_KEY_ID=$TF_VAR_AWS_ACCESS_KEY_ID
- export AWS_SECRET_ACCESS_KEY=$TF_VAR_AWS_SECRET_ACCESS_KEY
что приводит к дублированию замаскированных переменных и той же ошибке, описанной выше. printenv
вывод в buildspec.yml:
AWS_ACCESS_KEY_ID=***
TF_VAR_AWS_ACCESS_KEY_ID=***
AWS_SECRET_ACCESS_KEY=***
TF_VAR_AWS_SECRET_ACCESS_KEY=***
Возможные пути решения:
- Каким-то образом успешно передать значения учетных данных хранилища параметров MASKED в Terraform (предпочтительно)
- Передайте конфиденциальные учетные данные провайдеру Terraform AWS другим способом, например Секретный менеджер AWS, роль IAM и т. Д.
- Снимите маску с переменных хранилища параметров для передачи провайдеру aws (вероятно, в первую очередь лишает смысла использование системного менеджера aws)