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

如何通过AWS CDK配置AWS Fargate容器化WordPress并解决文件上传问题

解决AWS CDK Fargate WordPress 无法上传文件/安装主题的问题

你遇到的核心问题是容器化WordPress的存储没有持久化——默认情况下Fargate容器的本地存储是临时的,容器重启或扩容后数据就会丢失,而且多容器实例之间也无法共享文件。最优雅的方案是用**Amazon EFS(弹性文件系统)**作为共享存储卷挂载到WordPress容器的/var/www/html/wp-content目录(主题、插件、上传文件都存在这里),下面是具体的CDK实现步骤:

步骤1:创建EFS文件系统和访问点

首先在CDK栈中添加EFS资源,配置VPC和安全组,确保Fargate任务能访问:

// 新增:EFS 文件系统配置
const efsFileSystem = new efs.FileSystem(this, 'WordpressEfs', {
  vpc: vpc,
  securityGroup: wordpressSg, // 使用已有的WordPress安全组
  removalPolicy: cdk.RemovalPolicy.DESTROY, // 测试环境用,生产环境建议RETAIN
});

// 创建EFS访问点,指定挂载路径和权限
const efsAccessPoint = efsFileSystem.addAccessPoint('WordpressEfsAccessPoint', {
  path: '/wp-content',
  createAcl: {
    ownerUid: '33', // WordPress容器中www-data用户的UID
    ownerGid: '33',
    permissions: '0755',
  },
  posixUser: {
    uid: '33',
    gid: '33',
  },
});

步骤2:修改Fargate服务配置,挂载EFS卷

接下来调整ApplicationLoadBalancedFargateService的配置,添加卷和挂载点:

// 修改原有的Fargate服务配置,添加volume和mountPoints
const fargateService = new ecs_patterns.ApplicationLoadBalancedFargateService(this, 'WordpressFargateService', {
  cluster: ecsCluster,
  desiredCount: 1,
  cpu: 512,
  memoryLimitMiB: 1024,
  assignPublicIp: true,
  taskImageOptions: {
    image: ecs.ContainerImage.fromRegistry(wordpressRegistryName),
    environment: {
      WORDPRESS_DB_HOST: dbCluster.clusterEndpoint.socketAddress,
      WORDPRESS_DB_USER: DB_USER,
      WORDPRESS_DB_PASSWORD: DB_PASSWORD,
      WORDPRESS_DB_NAME: DB_NAME,
    },
    // 新增:挂载EFS卷到容器内的wp-content目录
    containerPort: 80,
    mountPoints: [
      {
        sourceVolume: 'wordpressContent',
        containerPath: '/var/www/html/wp-content',
        readOnly: false,
      },
    ],
  },
  // 新增:定义EFS卷
  taskSubnets: {
    subnetType: ec2.SubnetType.PUBLIC, // 和VPC配置一致
  },
  volumes: [
    {
      name: 'wordpressContent',
      efsVolumeConfiguration: {
        fileSystemId: efsFileSystem.fileSystemId,
        transitEncryption: 'ENABLED',
        authorizationConfig: {
          accessPointId: efsAccessPoint.accessPointId,
          iam: 'ENABLED',
        },
      },
    },
  ],
});

步骤3:调整安全组规则,允许Fargate访问EFS

确保安全组允许NFS协议(端口2049)的流量:

// 允许Fargate任务访问EFS的NFS端口
wordpressSg.addIngressRule(ec2.Peer.securityGroupId(fargateService.service.connections.securityGroups[0].securityGroupId), ec2.Port.tcp(2049), 'Allow NFS access from Fargate');

关键说明

  • EFS访问点的权限:WordPress容器内运行的是www-data用户(UID/GID都是33),所以必须把EFS访问点的所有者设置为33,否则容器会没有读写权限。
  • 多实例共享:EFS是分布式文件系统,后续如果扩容Fargate任务到多个实例,所有实例都会共享同一个wp-content目录,完美适配WordPress的多实例场景。
  • 成本考量:EFS按实际存储量计费,对于小型WordPress站点成本很低,而且不需要管理存储服务器。

我已经基于这个方案完成了可运行的配置,调整后的代码可以直接复用,你可以根据自己的环境修改参数(比如移除测试用的RemovalPolicy、调整实例规格等)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 21:57:46