Как попросить Terraform CLI использовать AWS общие учетные данные, а не AWS профиль экземпляра EC2 своего хоста - PullRequest
1 голос
/ 12 июля 2020

Попытка запустить Terraform CLI v0.12.28 на AWS EC2 через скрипт пользовательских данных. Когда экземпляр инициализируется, он должен автоматически инициировать построение инфраструктуры.

Инфраструктура для построения может находиться в других облаках или учетных записях. Учетные данные хранятся в хранилище параметров SSM. Экземпляр EC2 имеет профиль роли, разрешающий доступ к хранилищу параметров.

export TF_LOG=TRACE
export TF_IN_AUTOMATION=1
export AWS_PROFILE=digital_ocean
export AWS_SDK_LOAD_CONFIG=1
AWS_EC2_METADATA_DISABLED=true
/usr/local/bin/terraform init -input=false

Проблема в том, что инициализация Terraform завершается неудачно при отправке заголовка X-AMZ-SECURITY-TOKEN. Заголовок не распознается другим облачным провайдером (Digital Ocean - с использованием AWS S3 API).

[INFO] Attempting to use session-derived credentials
[INFO] Successfully derived credentials from session
[INFO] AWS Auth provider used: "EC2RoleProvider"
...
HTTP/1.1 501 Not Implemented
Connection: close
Content-Length: 248
Content-Type: application/xml
Strict-Transport-Security: max-age=15552000; includeSubDomains; preload
X-Amz-Error-Code: NotImplemented
X-Amz-Error-Message: Server does not support one or more requested headers. Please see https://developers.digitalocean.com/documentation/spaces/#aws-s3-compatibility
X-Do-Spaces-Error: unsupported_header_x-amz-security-token
...
status code: 501, request id: , host id: 
Error refreshing state: NotImplemented: Server does not support one or more requested headers. Please see https://developers.digitalocean.com/documentation/spaces/#aws-s3-compatibility

Выполнение тех же команд вручную после успешного завершения инициализации.

[INFO] AWS Auth provider used: "SharedCredentialsProvider"

Ключевым отличием, по-видимому, является используемый AWS провайдер аутентификации.

Мой вопрос: Как я могу убедить Terraform использовать только SharedCredentialsProvider , даже если экземпляр EC2 имеет профиль роли?

Кроме того, почему должна быть разница в провайдере аутентификации, когда пользователь входит в систему и выполняет те же команды вручную (sudo su - root ...)?

Платформа: EC2 / Amazon Linux 2

1 Ответ

0 голосов
/ 14 июля 2020

Проблема заключалась в том, что в среде пользовательских данных отсутствовали некоторые переменные.

Я добавил следующее в скрипт пользовательских данных, и TF init работает должным образом:

export AWS_AUTO_SCALING_HOME=/opt/aws/apitools/as
export AWS_CLOUDWATCH_HOME=/opt/aws/apitools/mon
export AWS_ELB_HOME=/opt/aws/apitools/elb
export AWS_PATH=/opt/aws
export EC2_AMITOOL_HOME=/opt/aws/amitools/ec2
export EC2_HOME=/opt/aws/apitools/ec2
export HOME=/root
export LOGNAME=root
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/aws/bin:/root/bin
export SHELL=/bin/bash
export USER=root

Фактически , чтобы быть более конкретным c, сценарий пользовательских данных выполняет некоторую настройку (создает каталоги, устанавливает пакеты и т. д. c.) и откладывает вызов TF с помощью 'at'. Это необходимо для того, чтобы экземпляр EC2 мог правильно загрузиться.

Переменные среды находятся в сценарии at

# yum install ... &co
#
cat > /run/tf/run_tf <<EOF
#!/bin/bash
cd /run/tf/XXX

export TF_VAR_zzz="${...}"
export TF_LOG=TRACE
export TF_IN_AUTOMATION=1
export AWS_PROFILE="..."
export AWS_SDK_LOAD_CONFIG=1
export AWS_EC2_METADATA_DISABLED=true

export AWS_AUTO_SCALING_HOME=/opt/aws/apitools/as
export AWS_CLOUDWATCH_HOME=/opt/aws/apitools/mon
export AWS_ELB_HOME=/opt/aws/apitools/elb
export AWS_PATH=/opt/aws
export EC2_AMITOOL_HOME=/opt/aws/amitools/ec2
export EC2_HOME=/opt/aws/apitools/ec2
export HOME=/root
export LOGNAME=root
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/aws/bin:/root/bin
export SHELL=/bin/bash
export USER=root

/usr/local/bin/terraform init -input=false
/usr/local/bin/terraform plan -input=false -out=tfplan
EOF
chmod 0755 /run/tf/run_tf
at now +2 minutes -f /run/tf/run_tf
...