提供从 ECS 任务对 EFS 的访问

2024-01-03

我正在努力获取 ECS 任务来查看 EFS 卷。 地形配置是:

EFS定义

resource "aws_efs_file_system" "persistent" {
encrypted = true
}

resource "aws_efs_access_point" "access" {
  file_system_id = aws_efs_file_system.persistent.id
}

resource "aws_efs_mount_target" "mount" {
  for_each = {for net in aws_subnet.private : net.id => {id = net.id}}
  file_system_id = aws_efs_file_system.persistent.id
  subnet_id      = each.value.id
  security_groups = [aws_security_group.efs.id]
}

任务定义

resource "aws_ecs_task_definition" "app" {
  family                   = "backend-app-task"
  execution_role_arn       = aws_iam_role.ecs_task_execution_role.arn
  task_role_arn = aws_iam_role.ecs_task_role.arn
  network_mode             = "awsvpc"
  requires_compatibilities = ["FARGATE"]
  cpu                      = var.fargate_cpu
  memory                   = var.fargate_memory
  container_definitions    = data.template_file.backendapp.rendered
  volume {
    name = "persistent"

    efs_volume_configuration {
      file_system_id          = aws_efs_file_system.persistent.id
      root_directory          = "/opt/data"
      transit_encryption      = "ENABLED"
      transit_encryption_port = 2999
      authorization_config {
        access_point_id = aws_efs_access_point.access.id
        iam             = "ENABLED"
      }
    }
  }
}

安全组

resource "aws_security_group" "efs" {
  name        = "efs-security-group"
  vpc_id      = aws_vpc.main.id

  ingress {
    protocol        = "tcp"
    from_port       = 2999
    to_port         = 2999
    security_groups = [aws_security_group.ecs_tasks.id]
    cidr_blocks = [for net in aws_subnet.private : net.cidr_block]
  }
}

任务角色

resource "aws_iam_role" "ecs_task_role" {
  name               = "ecsTaskRole"

  assume_role_policy  = data.aws_iam_policy_document.ecs_task_execution_role_base.json
  managed_policy_arns = ["arn:aws:iam::aws:policy/AmazonElasticFileSystemFullAccess","arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy", aws_iam_policy.ecs_exec_policy.arn]
}

据我了解 AWS 文档,IAM 角色应该具有访问权限,并且安全组应该传递流量,但错误表明该任务无法解析 EFS 实例。

错误信息是:

ResourceInitializationError: failed to invoke EFS utils commands to set up EFS volumes: stderr: Failed to resolve "fs-0000000000000.efs.eu-west-2.amazonaws.com" - check that your file system ID is correct. 

我已经在控制台中手动确认 EFS id 是正确的,所以我只能得出结论,由于网络/权限问题而无法解决。

- 编辑 -ECS服务定义

resource "aws_ecs_service" "main" {
  name            = "backendservice"
  cluster         = aws_ecs_cluster.main.id
  task_definition = aws_ecs_task_definition.app.arn
  desired_count   = var.app_count
  launch_type     = "FARGATE"
  enable_execute_command = true

  network_configuration {
    security_groups  = [aws_security_group.ecs_tasks.id]
    subnets          = aws_subnet.private.*.id
    assign_public_ip = true
  }

  load_balancer {
    target_group_arn = aws_alb_target_group.app.id
    container_name   = "server"
    container_port   = var.app_port
  }

  depends_on = [aws_alb_listener.backend]
}

ECS 任务安全组

resource "aws_security_group" "ecs_tasks" {
  name        = "backend-ecs-tasks-security-group"
  description = "allow inbound access from the ALB only"
  vpc_id      = aws_vpc.main.id

  ingress {
    protocol        = "tcp"
    from_port       = var.app_port
    to_port         = var.app_port
    security_groups = [aws_security_group.lb.id]
  }

  egress {
    protocol    = "-1"
    from_port   = 0
    to_port     = 0
    cidr_blocks = ["0.0.0.0/0"]
  }
}

VPC 定义(减去互联网网关)

data "aws_availability_zones" "available" {
}

resource "aws_vpc" "main" {
  cidr_block = "172.17.0.0/16"
}

# Create var.az_count private subnets, each in a different AZ
resource "aws_subnet" "private" {
  count             = var.az_count
  cidr_block        = cidrsubnet(aws_vpc.main.cidr_block, 8, count.index)
  availability_zone = data.aws_availability_zones.available.names[count.index]
  vpc_id            = aws_vpc.main.id
}

resource "aws_subnet" "public" {
  count                   = var.az_count
  cidr_block              = cidrsubnet(aws_vpc.main.cidr_block, 8, var.az_count + count.index)
  availability_zone       = data.aws_availability_zones.available.names[count.index]
  vpc_id                  = aws_vpc.main.id
  map_public_ip_on_launch = true
}

EDIT

事实证明,容器模板中缺少 mountPoints 块。我现在已经添加了,但结果是一样的。


遇到这个问题,我是这样解决的:

  1. platform_version = "1.4.0" on the aws_ecs_service,它可能不再相关,但在我用作起点的这篇博客文章中https://medium.com/@ilia.lazebnik/attaching-an-efs-file-system-to-an-ecs-task-7bd15b76a6ef https://medium.com/@ilia.lazebnik/attaching-an-efs-file-system-to-an-ecs-task-7bd15b76a6ef
  2. 确信aws_efs_mount_target has subnet_id and security_groups设置为与服务使用的相同的值。由于我对多个可用区域使用多个子网,因此我为每个可用区域创建了挂载目标。
  3. 添加了标准 EFS 端口 2049ingress如果没有该安装操作就会因超时错误而失败。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

提供从 ECS 任务对 EFS 的访问 的相关文章

随机推荐

  • 将 NASM 和 64 位 C 代码编译并链接到引导加载程序中 [重复]

    这个问题在这里已经有答案了 我制作了一个非常简单的一级引导加载程序 它执行两个主要操作 从 16 位实模式切换到 64 位长模式 并从硬盘读取接下来的几个用于启动基本内核的扇区 对于基本内核 我尝试用 C 而不是汇编编写代码 对此我有一些疑
  • Windows Metro 应用程序中没有 P2P?

    在 BUILD 的 NET 开发人员对 Windows 8 应用程序开发的看法 会议中 讲师提到 Metro 配置文件中仅公开了客户端 WCF 功能 我们无法创建服务器 http channel9 msdn com Events BUILD
  • 添加缓存到 Zend\Form\Annotation\AnnotationBuilder

    因为我终于找到了一个二进制文件memcache对于 Windows 上的 PHP 5 4 4 我正在加快我当前正在开发的应用程序的速度 我已经成功将 memcache 设置为 Doctrine ORM 映射缓存驱动程序 但我需要修复另一个泄
  • 标准化 Tensorflow 对象检测 API 的输入

    Tensorflow 对象检测 API 默认情况下是否会进行类似于输入标准化的预处理 我在任何地方都找不到任何有关它的文档 数据增强中有一个名为 NormalizeImage 的选项 在动物园模型的所有配置文件中 我从未看到它被使用过 下雨
  • 是否可以将文件组从一个数据库复制到另一个数据库?

    我想提取数据库的子集并复制到另一个服务器 数据库 是否可以从一个数据库复制 备份单个文件组并附加 恢复到另一个数据库 您无法将文件组恢复到不同的数据库中 任何还原操作都必须经历恢复阶段 此时针对还原的数据文件重播日志 并且新数据库将具有与还
  • 使用 Moq 模拟依赖属性

    如果我有一个类 它具有通过属性注入解决的依赖项 是否可以使用 Moq 来模拟该属性的行为 e g public class SomeClass empty constructor public SomeClass dependency pu
  • 字符串不变性。更改后是否必须将其重新分配给同一个变量?

    字符串是不可变的 这是否意味着我总是必须对传递给方法的字符串执行类似的操作 str str toLowerCase or is str toLowerCase 美好的 我尝试了第二个 但没有给我任何错误 为什么 字符串是不可变的 是的 你自
  • zend框架如何获取当前登录的用户详细信息

    我想获取在 zend 框架中登录我的网站的用户详细信息 您可以像这样获取存储在 Zend Auth 中的数据 identity Zend Auth getInstance gt getIdentity The identity变量现在应该包
  • 如何在 SwiftUI 中异步请求完成后调用函数?

    我有一个函数可以调用 2 种类型的 api 请求来获取我的应用程序中需要的一堆数据 在该函数中 我发出位置请求 然后对于响应中的每个位置 我发出不同的请求以获取该特定位置的详细信息 例如 如果请求 1 返回 20 个位置 则我的第二个请求将
  • 重写 BeanPropertyRowMapper 以支持 JodaTime DateTime

    我的域对象有几个 Joda TimeDateTime字段 当我使用 SimpleJdbcTemplate 读取数据库值时 病人病人 jdbc queryForObject sql new BeanPropertyRowMapper Pati
  • 断言和设置基数

    为什么下面的断言会失败 另外 如果我取消评论 为什么所有断言都有效ASSERT 0 第 22 行 function CountFactors i nat nat requires i gt 1 var a set b 1 lt b lt i
  • 排除版本中的列表参数用法:update-properties

    我的 pom 中有以下内容
  • 找不到入口符号_start

    我在 gcc 上编译的 c 代码给出了错误Cannot find entry symbol start defaulting to 00000 谁能告诉我为什么以及如何纠正它 命令行是arm none eabi gcc O3 march a
  • 更改有序列表上的编号?

    您可以更改有序列表的起始编号 如下所示 ol li item three li li item four li ol 但是有没有办法让列表项具有任意编号 而不仅仅是连续编号 ol li item two li li item six li
  • C# - 线程池与任务

    正如一些人可能在 NET 4 0 中看到的那样 他们添加了一个新的命名空间System Threading Tasks这基本上就是任务的意思 我只使用了几天 从使用 ThreadPool 开始 哪一种效率更高 资源消耗更少 或者只是整体更好
  • 如果有人通过 Node js 应用程序中的 multer 将扩展名从 exe 更改为 png,则不应允许文件上传

    我正在使用上传文件multer在我的nodejs express js 应用程序中 它运行良好 我在那里进行了 mime 类型检查 也只允许 png 文件 但如果我更改上传文件的扩展名abc exe to abc png它也会被上传 这是错
  • Apache Airflow 中的调度程序间隔和启动时间工作不正确

    找不到任务开始时间的解决方案 我有代码 但找不到我错在哪里 当我运行 DAG 时 25 03 26 03 27 03 任务已经完成 但是今天 28 03 6点48分任务还没有开始 我尝试过使用 cron 表达式 钟摆 日期时间 结果是相同的
  • 使用 Python 计算线性回归标准化系数 (beta)

    我想计算beta 或标准化系数 https en wikipedia org wiki Standardized coefficient使用 Python 中的标准工具 numpy pandas scipy stats 等 构建线性回归模型
  • Rails 中的单元测试 - 带回形针的模型

    我正在尝试使用回形针为带有图片的模型编写测试 我使用的是默认测试框架 没有 shoulda 或 rspec 在这种情况下 我该如何测试呢 我真的应该上传文件吗 我应该如何将文件添加到夹具 将文件添加到模型非常简单 例如 post Post
  • 提供从 ECS 任务对 EFS 的访问

    我正在努力获取 ECS 任务来查看 EFS 卷 地形配置是 EFS定义 resource aws efs file system persistent encrypted true resource aws efs access point