我创建了一个 CircleCI 管道,它使用 Terraform 构建 AWS 基础设施。
现在的问题是如何运行 Alembic 迁移。
那么,如何在 AWS Lambda 中运行 alembic 迁移?
我尝试了多种方法,直到找到解决方案。我希望它可以帮助别人。 以下是我开始在 CircleCI 中创建 Alembic Lambda 层的方法:
mkdir profile_alembic_lambda_layer
pip install alembic -t profile_alembic_lambda_layer/
这是我的主要 Terraform 代码
data "archive_file" "lambda_alembic_migrations_archive" {
type = "zip"
source_dir = "lambda_alembic_migrations"
output_path = "lambda_alembic_migrations.zip"
}
data "archive_file" "profile_alembic_lambda_layer_archive" {
type = "zip"
source_dir = "profile_alembic_lambda_layer"
output_path = "profile_alembic_lambda_layer.zip"
}
resource "aws_lambda_layer_version" "profile_alembic_lambda_layer" {
filename = data.archive_file.profile_alembic_lambda_layer_archive.output_path
layer_name = "profile_alembic_lambda_layer"
compatible_runtimes = ["python3.8"] # Specify the runtime(s) your layer is compatible with
}
resource "aws_lambda_function" "alembic_migrations_lambda" {
filename = data.archive_file.lambda_alembic_migrations_archive.output_path
function_name = "alembic_migrations_lambda_handler"
role = aws_iam_role.lambda_execution_role.arn
handler = "src.app.lambda_postgresql.lambdas.alembic_migration.alembic_migration_lambda_handler"
runtime = var.aws_lambda_python_runtime
source_code_hash = data.archive_file.lambda_alembic_migrations_archive.output_base64sha256
depends_on = [
data.archive_file.lambda_alembic_migrations_archive,
aws_cloudwatch_log_group.lambda_alembic_migrations_log_group,
]
timeout = 900
layers = [
aws_lambda_layer_version.profile_lambda_layer.arn,
aws_lambda_layer_version.profile_alembic_lambda_layer.arn
]
vpc_config {
subnet_ids = var.subnet_ids
security_group_ids = var.lambda_security_group_ids
}
environment {
variables = {
DATABASE_HOST = var.postgres_db_host
DATABASE_PORT = var.postgres_db_port
DATABASE_NAME = var.postgres_db_name
DATABASE_USER = var.postgres_db_user
DATABASE_PASSWORD = var.postgres_db_user_password
LD_LIBRARY_PATH = "/var/task"
}
}
}
这是我使用的 Lambda 函数:
import sys
sys.path.append('/opt')
import alembic.config
def alembic_migration_lambda_handler(event, context):
""" Create Company Lambda Function Handler """
print("Start")
alembicArgs = [
'--raiseerr',
'upgrade', 'head',
]
alembic.config.main(argv=alembicArgs)
感谢@mimo 的评论。这是解决方案的一部分!