docker - ECS Fargate 部署卡住,无法部署 ECS 服务

标签 docker aws-cloudformation amazon-ecs aws-fargate

我是 ECS 新手,我正在尝试使用 Cloudformation 部署它。

我通过查看文档以及从博客和一些文章中找到的一些示例来制作以下 cloudformation 模板。

但是,由于某种原因,它在更新其中一个资源时卡住了,最终超时。 我不知道为什么它会卡住并失败。

有人能发现我犯的错误吗?

目前,我的目标是在互联网上部署并查看该应用程序。我并不是真的在寻找高级配置。 我还在部署 aws cli 时将 ecr url 传递给它。

提前谢谢您。

AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::Serverless-2016-10-31
Description: >
  ECS Service

Parameters:
  Environment:
    Type: String
    Default: alpha
    AllowedValues:
      - alpha
      - beta
      - production
  ECRDockerUri:
    Type: String
    Default: <url for ecr repo> 
  ContainerPort: 
    Type: Number
    Default: 8080

Resources:
  LogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      LogGroupName: !Sub "${Environment}-fake-user-api-logGroup"
      RetentionInDays: 30

  ECSCluster:
    Type: 'AWS::ECS::Cluster'
    Properties:
      ClusterName: !Sub "${Environment}-MyFargateCluster"

  ExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Sub "${Environment}-${AWS::AccountId}-ExecutionRole"
      AssumeRolePolicyDocument:
        Statement:
          - Effect: Allow
            Principal:
              Service: ecs-tasks.amazonaws.com
            Action: 'sts:AssumeRole'
      ManagedPolicyArns:
        - 'arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy'

  ECSService:
    Type: AWS::ECS::Service
    Properties:
      ServiceName: !Sub "${Environment}-${AWS::AccountId}-ECSService"
      Cluster: !Ref ECSCluster
      TaskDefinition: !Ref TaskDefinition
      DesiredCount: 1
  
  TaskDefinition:
    Type: AWS::ECS::TaskDefinition
    Properties:
      TaskRoleArn: !Ref ExecutionRole
      ContainerDefinitions:
        - Name: !Sub "${Environment}-${AWS::AccountId}-Container"
          Image: !Ref ECRDockerUri
          Memory: 1024
          Essential: true
          DisableNetworking: false
          Privileged: true
          ReadonlyRootFilesystem: true
          Environment: 
            - Name: SPRING_PROFILES_ACTIVE
              Value: !Ref Environment
          PortMappings:
            - ContainerPort: !Ref ContainerPort
              HostPort: !Ref ContainerPort
          LogConfiguration:
            LogDriver: awslogs
            Options:
              awslogs-group: !Ref LogGroup
              awslogs-region: ca-central-1


最佳答案

我检查了你的 CFN 堆栈,发现缺少一些东西。我注意到您的集群名称是 ENV-MyFargateCluster,因此我假设您的目标是创建 Fargate 服务。要运行 Fargate 服务,您需要提供网络配置并通过指定启动类型通知您要创建 Fargate 服务。另外,Fargate 任务无法获得特权。

下面是我的代码片段:

AWSTemplateFormatVersion: 2010-09-09
Transform: 'AWS::Serverless-2016-10-31'
Description: |
  ECS Service
Parameters:
  Environment:
    Type: String
    Default: alpha
    AllowedValues:
      - alpha
      - beta
      - production
  ECRDockerUri:
    Type: String
    Default: 'image'
  ContainerPort:
    Type: Number
    Default: 80
Resources:
  LogGroup:
    Type: 'AWS::Logs::LogGroup'
    Properties:
      LogGroupName: !Sub '${Environment}-fake-user-api-logGroup'
      RetentionInDays: 30
  ECSCluster:
    Type: 'AWS::ECS::Cluster'
    Properties:
      ClusterName: !Sub '${Environment}-MyFargateCluster'
  ExecutionRole:
    Type: 'AWS::IAM::Role'
    Properties:
      RoleName: !Sub '${Environment}-${AWS::AccountId}-ExecutionRole'
      AssumeRolePolicyDocument:
        Statement:
          - Effect: Allow
            Principal:
              Service: ecs-tasks.amazonaws.com
            Action: 'sts:AssumeRole'
      ManagedPolicyArns:
        - 'arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy'
  ECSService:
    Type: 'AWS::ECS::Service'
    Properties:
      ServiceName: !Sub '${Environment}-${AWS::AccountId}-ECSService'
      LaunchType: FARGATE
      Cluster: !Ref ECSCluster
      TaskDefinition: !Ref TaskDefinition
      DesiredCount: 1
      NetworkConfiguration:
        AwsvpcConfiguration:
          AssignPublicIp: ENABLED
          SecurityGroups:
            - sg-XXXXXXXXXX
          Subnets:
            - subnet-XXXXXXXXXX
  TaskDefinition:
    Type: 'AWS::ECS::TaskDefinition'
    Properties:
      RequiresCompatibilities:
        - FARGATE
      TaskRoleArn: !Ref ExecutionRole
      ExecutionRoleArn: !Ref ExecutionRole
      ContainerDefinitions:
        - Name: !Sub '${Environment}-${AWS::AccountId}-Container'
          Image: !Ref ECRDockerUri
          Memory: 1024
          Essential: true
          DisableNetworking: false
          Privileged: false
          ReadonlyRootFilesystem: true
          Environment:
            - Name: SPRING_PROFILES_ACTIVE
              Value: !Ref Environment
          PortMappings:
            - ContainerPort: !Ref ContainerPort
          LogConfiguration:
            LogDriver: awslogs
            Options:
              awslogs-group: !Ref LogGroup
              awslogs-region: ca-central-1
              awslogs-stream-prefix: test
      Cpu: '1024'
      Memory: '2048'
      NetworkMode: awsvpc

关于docker - ECS Fargate 部署卡住,无法部署 ECS 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73006795/

相关文章:

docker - 无法使用 EF Core Mysql 提供程序将 Docker 中的 Asp.net Core Web Api 连接到主机服务器上的非 Docker Mysql

docker - 在 dockerfile 中使用 secret

postgresql - 将 postgres docker 实例连接到 dotnet core 3.1 给出 "nodename nor servname provided, or not known error"

amazon-web-services - ECS:docker ps不显示正在运行的任务

aws-cloudformation - 不允许使用无关 key [HealthCheck]

docker - 带有 ECS 的代码管道

docker - 在 Kubernetes 中的工作节点之间共享存储/卷?

amazon-web-services - 如何在 AWS CloudFormationTemplate 中引用 Lambda 的 AWS GlobalSecondaryIndex 名称

amazon-web-services - 是否可以就地定义 Cloudformation 资源?

amazon-web-services - 我可以从 CloudFormation 模板中的私有(private) ECR 存储库中选择容器镜像吗?