基于Terraform的Apache Superset分布式架构配置存储方案咨询
可行解决方案
下面是几个符合你需求的方案,均无需自定义镜像或不可靠的启动后bash脚本:
方案1:AWS DataSync + Terraform 自动同步S3配置到EFS
这是最可靠的方案,利用AWS托管的DataSync服务完成S3到EFS的配置同步,无需手动编写脚本,支持一次性或定期同步。
实现步骤:
- 用Terraform定义存放Superset配置文件的S3桶,上传
superset_config.py等静态配置文件 - 配置DataSync的源位置(指向S3桶)和目标位置(指向EFS文件系统)
- 创建DataSync同步任务,设置为一次性触发(或按需触发)
- 让ECS服务依赖DataSync任务,确保配置同步完成后再启动Superset容器
Terraform代码片段:
# S3桶存放Superset配置 resource "aws_s3_bucket" "superset_config" { bucket = "superset-config-${random_string.suffix.result}" } # 上传配置文件到S3 resource "aws_s3_object" "superset_config_file" { bucket = aws_s3_bucket.superset_config.bucket key = "superset_config.py" source = "./superset_config.py" # 本地配置文件路径 } # DataSync访问S3的IAM角色 resource "aws_iam_role" "datasync_s3_access" { name = "datasync-superset-s3-access" assume_role_policy = jsonencode({ Version = "2012-10-17" Statement = [{ Action = "sts:AssumeRole" Effect = "Allow" Principal = { Service = "datasync.amazonaws.com" } }] }) } resource "aws_iam_role_policy_attachment" "datasync_s3_policy" { role = aws_iam_role.datasync_s3_access.name policy_arn = "arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess" } # DataSync S3源位置 resource "aws_datasync_location_s3" "superset_s3" { s3_bucket_arn = aws_s3_bucket.superset_config.arn s3_config { bucket_access_role_arn = aws_iam_role.datasync_s3_access.arn } } # DataSync EFS目标位置 resource "aws_datasync_location_efs" "superset_efs" { efs_file_system_arn = aws_efs_file_system.superset.arn ec2_config { security_group_arns = [aws_security_group.superset_efs_access.arn] subnet_arn = aws_subnet.private.arn } } # DataSync一次性同步任务 resource "aws_datasync_task" "sync_config" { source_location_arn = aws_datasync_location_s3.superset_s3.arn destination_location_arn = aws_datasync_location_efs.superset_efs.arn name = "sync-superset-config-to-efs" # 配置一次性触发(也可按需手动触发) schedule { schedule_expression = "cron(0 0 1 1 ? *)" # 仅执行一次的 cron 表达式 } depends_on = [aws_efs_mount_target.superset, aws_s3_object.superset_config_file] } # ECS服务依赖同步任务,确保配置到位后启动 resource "aws_ecs_service" "superset" { cluster = aws_ecs_cluster.superset.id task_definition = aws_ecs_task_definition.superset.arn # ... 其他ECS服务配置 ... depends_on = [aws_datasync_task.sync_config] }
方案2:临时EC2实例 + Terraform 同步S3到EFS
适合小规模场景,用临时EC2实例完成同步,同步完成后自动销毁,无需额外托管服务。
实现思路:
- 创建一个临时EC2实例,挂载EFS并安装AWS CLI
- 执行
s3 sync将S3中的配置文件同步到EFS - 同步完成后自动关机销毁实例
- ECS服务依赖临时实例销毁事件,确保配置同步完成
Terraform代码片段:
# 临时EC2实例的IAM角色(S3读+EFS访问权限) resource "aws_iam_role" "sync_efs_role" { name = "sync-superset-efs-role" assume_role_policy = jsonencode({ Version = "2012-10-17" Statement = [{ Action = "sts:AssumeRole" Effect = "Allow" Principal = { Service = "ec2.amazonaws.com" } }] }) } resource "aws_iam_role_policy_attachment" "sync_efs_policy" { role = aws_iam_role.sync_efs_role.name policy_arn = "arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess" } # 临时EC2实例 resource "aws_instance" "sync_efs_temp" { ami = "ami-0c55b159cbfafe1f0" # Amazon Linux 2 AMI(自带EFS Utils) instance_type = "t3.nano" vpc_security_group_ids = [aws_security_group.superset_efs_access.arn] subnet_id = aws_subnet.private.arn iam_instance_profile = aws_iam_instance_profile.sync_efs.name # 用户数据:挂载EFS、同步S3、销毁实例 user_data = <<-EOF #!/bin/bash yum install -y amazon-efs-utils aws-cli mkdir -p /mnt/efs mount -t efs ${aws_efs_file_system.superset.id}:/ /mnt/efs aws s3 sync s3://${aws_s3_bucket.superset_config.bucket}/ /mnt/efs/ umount /mnt/efs shutdown -h now EOF depends_on = [aws_efs_mount_target.superset, aws_s3_object.superset_config_file] # 确保实例销毁后不再重建 lifecycle { ignore_changes = [user_data] prevent_destroy = false } } # ECS服务依赖临时实例销毁 resource "aws_ecs_service" "superset" { # ... 其他ECS服务配置 ... depends_on = [aws_instance.sync_efs_temp] }
方案3:利用Superset环境变量减少配置文件依赖
Superset支持大量配置通过环境变量直接设置,无需修改superset_config.py,可大幅减少需要同步到EFS的配置文件数量:
- 核心配置示例:
SUPERSET_SECRET_KEY: 替代配置文件中的SECRET_KEYSUPERSET_DB_URI: 数据库连接字符串SUPERSET_REDIS_URI: Redis缓存连接SUPERSET_WEBSERVER_PORT: 服务端口SUPERSET_FEATURE_FLAGS: 功能开关
- 仅将无法通过环境变量设置的自定义配置(如自定义视图、权限规则)放到
superset_config.py中,再通过上述方案同步到EFS。
内容的提问来源于stack exchange,提问作者hotPocket
相关产品推荐
相关产品推荐

