如何在 AWS Lambda 内运行 alembic 迁移?

问题描述 投票:0回答:1

我创建了一个 CircleCI 管道,它使用 Terraform 构建 AWS 基础设施。

现在的问题是如何运行 Alembic 迁移。

那么,如何在 AWS Lambda 中运行 alembic 迁移?

python amazon-web-services aws-lambda alembic
1个回答
0
投票

我尝试了多种方法,直到找到解决方案。我希望它可以帮助别人。 以下是我开始在 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 的评论。这是解决方案的一部分!

© www.soinside.com 2019 - 2024. All rights reserved.