Я хочу загрузить новый кластер RDS с пользователем и паролем, пока Terraform создает его экземпляр.
Я создал Lambda и успешно настроил кластер с жестко запрограммированными переменными. Вот Питон:
import boto3
import psycopg2
user = ""
password = ""
host = ""
database = ""
role_user = ""
role_passwd = ""
def lambda_handler(event, context):
connection = psycopg2.connect(f"user = {user} password = {password} host = {host} dbname = {database} port=5432")
cursor = connection.cursor()
cursor.execute(f"CREATE ROLE {role_user} WITH PASSWORD {role_passwd} CREATEDB CREATEROLE LOGIN ;")
cursor.execute(f"GRANT rds_superuser TO {role_user} ;")
print('Password applied')
Я хочу использовать ресурс Terraform 'aws_lambda_invocacy' для внедрения переменных, и я думал, что приведенный ниже код поможет, но я ошибаюсь.
resource "aws_lambda_invocation" "this" {
function_name = aws_lambda_function.this.function_name
input = jsonencode({
user = jsondecode(data.aws_secretsmanager_secret_version.rds.secret_string)["username"]
password = jsondecode(data.aws_secretsmanager_secret_version.rds.secret_string)["password"]
host = data.aws_rds_cluster.this.endpoint
database = "postgres"
role_user = jsondecode(data.aws_secretsmanager_secret_version.role.secret_string)["username"]
role_passwd = jsondecode(data.aws_secretsmanager_secret_version.role.secret_string)["password"]
})
}
Я получаю эту ошибку:
Error: invoking Lambda Function (bootstrap-modeler-hbmy-mct-joc-eu-west-1-dev): {"errorMessage": "name 'user' is not defined", "errorType": "NameError",
Я новичок в Lambda и надеюсь, что мне не хватает чего-то глупого, с чем вы можете мне помочь.






Функции AWS Lambda работают не так. input для функции AWS Lambda не обновляет переменные напрямую внутри исходного кода функции Lambda. Любые подобные входные данные будут доступны для вызова функции Lambda в виде атрибутов объекта event, который передается в обработчик Lambda.
Я предлагаю распечатать объект event в вашей функции Lambda, а затем изучить его в журналах CloudWatch, чтобы точно определить, как вам понадобится доступ к этим значениям в вашем коде.
Большое спасибо Марку за указание пути.
import boto3
import psycopg2
def lambda_handler(event, context):
connection = psycopg2.connect(user = event['user'],
password = event['password'],
host = event['host'])
cursor = connection.cursor()
cursor.execute(f"CREATE ROLE {event['role_user']} WITH PASSWORD \'{event['role_passwd']}\' CREATEDB CREATEROLE LOGIN;")
cursor.execute(f"GRANT rds_superuser TO {event['role_user']};")
cursor.close()
connection.commit()
print('Password applied')