You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将GitHub工作流文件复制到Amazon EFS(适配ECS Fargate)

解决AWS ECS Fargate + EFS 文件复制失败问题

核心问题分析

你的流程存在致命缺陷:Fargate容器启动后因找不到文件直接终止,根本无法执行预设的文件复制命令。需要调整思路,要么直接把文件传到EFS,要么确保容器启动前EFS中已有文件,再启动业务容器。


可行解决方案

方案1:直接从GitHub Runner上传文件到EFS

跳过容器中转,通过S3或EC2 bastion主机把文件直接传到EFS:

  • S3中转方式(适合GitHub托管Runner):
    1. 在GitHub工作流中,先把代码同步到S3:
      aws s3 sync ./your-source-dir s3://your-temp-bucket/efs-files/ --delete
      
    2. 用AWS Systems Manager Run Command,在挂载了EFS的EC2实例上执行同步:
      aws ssm send-command \
        --instance-ids i-xxxxxxxxx \ # 挂载EFS的EC2实例ID
        --document-name AWS-RunShellScript \
        --parameters commands="aws s3 sync s3://your-temp-bucket/efs-files/ /mnt/efs/target-dir/ --delete"
      
  • 自托管Runner直接挂载EFS(如果Runner在VPC内):
    在Runner实例上挂载EFS,工作流中直接执行本地同步:
    mkdir -p /mnt/efs/target-dir
    cp -R ./your-source-dir/* /mnt/efs/target-dir/
    

方案2:用初始化容器预加载文件到EFS

修改Fargate任务定义,添加初始化容器完成文件下载后,再启动业务容器:

  1. 在任务定义中添加初始化容器,挂载EFS卷,配置从S3拉取文件:
    "initContainers": [
      {
        "name": "efs-file-loader",
        "image": "amazon/aws-cli:latest",
        "command": ["aws", "s3", "sync", "s3://your-temp-bucket/efs-files/", "/mnt/efs/target-dir/"],
        "mountPoints": [
          {
            "sourceVolume": "efs-volume",
            "containerPath": "/mnt/efs/target-dir"
          }
        ],
        "essential": true,
        "executionRoleArn": "arn:aws:iam::xxxx:role/ecs-task-execution-role"
      }
    ]
    
  2. 主容器依赖初始化容器完成后启动,直接读取EFS中的文件即可。

方案3:调整CodeDeploy配置实现文件同步

如果使用CodeDeploy部署,修改appspec.yaml添加文件复制钩子:

version: 0.0
Resources:
  - TargetService:
      Type: AWS::ECS::Service
      Properties:
        TaskDefinition: "arn:aws:ecs:xx-region:xx-account:task-def/your-task:revision"
        LoadBalancerInfo:
          ContainerName: "your-container"
          ContainerPort: 80
Hooks:
  - BeforeInstall:
      - Location: scripts/copy_to_efs.sh
        Timeout: 300
        RunAs: root

copy_to_efs.sh脚本内容:

#!/bin/bash
mkdir -p /mnt/efs/app-files
cp -R /codedeploy-deployment-root/deployment-archive/* /mnt/efs/app-files/

确保任务角色拥有elasticfilesystem:ClientMount、elasticfilesystem:ClientWrite权限。


排查当前问题的关键步骤

  1. 查看CloudWatch日志:容器终止前的stderr/stdout能明确报错原因(找不到的具体文件、复制命令是否执行)。
  2. 验证EFS挂载配置:检查任务定义中EFS文件系统ID、访问点ID、容器挂载路径是否匹配。
  3. 检查任务角色权限:确认Fargate任务IAM角色拥有EFS读写权限。
  4. 确认文件是否到达容器:在GitHub工作流中添加步骤打印文件列表,验证部署包中是否包含目标文件。

内容的提问来源于stack exchange,提问作者simon Shim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 19:58:38