我使用 Terraform 设置了 ECS 集群。一切都很好,但我有几个问题。
1. 据我了解,EFS卷不需要挂载到ECS实例上。 AWS 允许我们将 EFS 卷文件夹直接挂载到容器中。我说得对吗?
resource "aws_ecs_task_definition" "Task" {
family = var.ServiceName
container_definitions = file("service.json")
tags = {
Name = data.terraform_remote_state.Cluster.outputs.TagName
Project = data.terraform_remote_state.Cluster.outputs.TagName
}
volume {
name = "service-storage"
efs_volume_configuration {
file_system_id = data.terraform_remote_state.Cluster.outputs.EfsVolumeId
root_directory = "/"
}
}
}
root_directory
这里是 EFS 卷内部到文件夹的路径,该文件夹将安装到容器中。
service.json
[
{
"name": "nginx13",
"image": "nginx",
"memory": 256,
"mountPoints": [
{
"containerPath": "/usr/share/nginx/html",
"sourceVolume": "service-storage"
}
],
"portMappings": [
{
"containerPort": 80
}
]
}
]
containerPath
这里是容器内部到将挂载 root_directory
文件夹的挂载点的路径。因此没有与 ECS 实例挂载点或其路径相关的参数。
2. 在创建新任务之前,我需要在 EFS 卷上创建一个文件夹,以便稍后将容器挂载到其中。现在,我只能使用 EFS 卷的根文件夹,因为它是空的。因此,我正在寻找一种方法来使用 terraform 模板管理 EFS 卷上文件夹的创建和删除。这是问题的第一部分,第二部分是将文件放入该文件夹中。 对此的最佳实践是什么?我应该使用某种部署解决方案(例如 Jenkins)还是可以仅使用 Terraform 来完成? EFS文件夹权限怎么样?需要改变吗?
使用 EFS 接入点: https://docs.aws.amazon.com/efs/latest/ug/efs-access-points.html
接入点通过在 EFS 中创建目录来工作。然后您可以设置该目录的访问权限。无论如何,这可能更适合您正在做的事情,因为它为您提供访问控制。
如果文件系统上不存在访问点的根目录路径,Amazon EFS 会自动创建具有可配置所有权和权限的根目录。
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/efs_access_point
如果这不合适:
我建议使用 lambda。
您可以使用您熟悉的任何可以挂载 EFS 的语言编写 lambda。然后让它创建一个目录。然后你可以使用空资源 local-exec 来调用这个 lambda。
您可以以编程方式创建 AWS EFS 接入点。官方文档提供了如何设置的详细信息:
https://docs.aws.amazon.com/efs/latest/ug/efs-access-points.html
但是,如果您希望接入点创建该文件夹,则需要执行以下操作:
我还建议使用官方的 Terraform 模块 来管理 EFS:
https://registry.terraform.io/modules/terraform-aws-modules/efs/aws/latest
使用此模块,您可以利用模块的输出轻松引用基础设施中的接入点:
module.efs.access_points.[you access point name].id