Вызов Terraform Lambda

Я хочу загрузить новый кластер 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 и надеюсь, что мне не хватает чего-то глупого, с чем вы можете мне помочь.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
72
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Функции 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')

Другие вопросы по теме