ECS EC2, использующий CloudFormation, застрял в CREATE_IN_PRO

#docker #amazon-ec2 #docker-compose #amazon-cloudformation #amazon-ecs

#docker #amazon-ec2 #docker-compose #aws-cloudformation #amazon-ecs

Вопрос:

Создание стека застряло бы в CREATE_IN_PROGRESS. Конкретно служба ресурсов. Создание стека завершилось бы без него. Вот как выглядит cloudformation. Я проверил CloudTrail, но не могу найти ничего необычного.

 AWSTemplateFormatVersion: '2010-09-09'
Description: Amazon ECS Preview Quickstart Template
Parameters:
  SubnetID:
    Type: String
  SubnetID2:
    Type: String
  ClusterName:
    Description: Name of your Amazon ECS Cluster
    Type: String
    ConstraintDescription: must be a valid Amazon ECS Cluster.
    Default: TestCluster
  KeyName:
    Description: Name of an existing EC2 KeyPair to enable SSH access to the instance
    Type: AWS::EC2::KeyPair::KeyName
    ConstraintDescription: must be the name of an existing EC2 KeyPair.
  InstanceType:
    Description: Container Instance type
    Type: String
    Default: t2.micro
    AllowedValues:
    - t2.micro
    - t2.small
    - t2.medium
    - m3.medium
    - m3.large
    - m3.xlarge
    - m3.2xlarge
    - c3.large
    - c3.xlarge
    - c3.2xlarge
    - c3.4xlarge
    - c3.8xlarge
    - r3.large
    - r3.xlarge
    - r3.2xlarge
    - r3.4xlarge
    - r3.8xlarge
    - i2.xlarge
    - i2.2xlarge
    - i2.4xlarge
    - i2.8xlarge
    - hi1.4xlarge
    - hs1.8xlarge
    - cr1.8xlarge
    - cc2.8xlarge
    ConstraintDescription: must be a valid EC2 instance type.
  SSHLocation:
    Description: " The IP address range that can be used to SSH to the EC2 instances"
    Type: String
    MinLength: '9'
    MaxLength: '18'
    Default: 0.0.0.0/0
    AllowedPattern: "(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})"
    ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
Mappings:
  AWSInstanceType2Arch:
    t2.micro:
      Arch: HVM64
    t2.small:
      Arch: HVM64
    t2.medium:
      Arch: HVM64
    m3.medium:
      Arch: HVM64
    m3.large:
      Arch: HVM64
    m3.xlarge:
      Arch: HVM64
    m3.2xlarge:
      Arch: HVM64
    c3.large:
      Arch: HVM64
    c3.xlarge:
      Arch: HVM64
    c3.2xlarge:
      Arch: HVM64
    c3.4xlarge:
      Arch: HVM64
    c3.8xlarge:
      Arch: HVM64
    r3.large:
      Arch: HVM64
    r3.xlarge:
      Arch: HVM64
    r3.2xlarge:
      Arch: HVM64
    r3.4xlarge:
      Arch: HVM64
    r3.8xlarge:
      Arch: HVM64
    i2.xlarge:
      Arch: HVM64
    i2.2xlarge:
      Arch: HVM64
    i2.4xlarge:
      Arch: HVM64
    i2.8xlarge:
      Arch: HVM64
    hi1.4xlarge:
      Arch: HVM64
    hs1.8xlarge:
      Arch: HVM64
    cr1.8xlarge:
      Arch: HVM64
    cc2.8xlarge:
      Arch: HVM64
  AWSRegionArch2AMI:
    us-east-1:
      HVM64: ami-34ddbe5c
Resources:
  Cluster:
    Type: AWS::ECS::Cluster
    Properties:
      ClusterName: ClusterName
  LogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      LogGroupName: deployment-example-log-group
  ContainerInstance:
    Type: AWS::EC2::Instance
    Properties:
      IamInstanceProfile:
        Ref: ECSIamInstanceProfile
      ImageId:
        Fn::FindInMap:
        - AWSRegionArch2AMI
        - Ref: AWS::Region
        - Fn::FindInMap:
          - AWSInstanceType2Arch
          - Ref: InstanceType
          - Arch
      InstanceType:
        Ref: InstanceType
      SecurityGroups:
      - Ref: ECSQuickstartSecurityGroup
      KeyName:
        Ref: KeyName
      UserData:
        Fn::Base64:
          Fn::Join:
          - ''
          - - "#!/bin/bash -xen"
            - echo ECS_CLUSTER=
            - Ref: ClusterName
            - " >> /etc/ecs/ecs.confign"
  ECSQuickstartSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Enable HTTP access via SSH
      SecurityGroupIngress:
      - IpProtocol: tcp
        FromPort: '22'
        ToPort: '22'
        CidrIp:
          Ref: SSHLocation
  ECSIamInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: "/"
      Roles:
      - Ref: ECSQuickstartRole
  ECSQuickstartRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Principal:
            Service:
            - ec2.amazonaws.com
          Action:
          - sts:AssumeRole
      Path: "/"
      Policies:
      - PolicyName: ECSQuickstart
        PolicyDocument:
          Version: '2012-10-17'
          Statement:
          - Effect: Allow
            Action: ecs:*
            Resource: "*"

  TaskDefinition:
    Type: AWS::ECS::TaskDefinition
    Properties:
      Family: deployment-example-task
      Cpu: 256
      Memory: 512
      # NetworkMode: awsvpc
      TaskRoleArn: !Ref ECSQuickstartRole
      ContainerDefinitions:
        - 
          Name: engine
          Image:  gcr.io/xxxxx
          Environment: 
            - Name: db_instance
              Value: "clouform2"
            - Name: LOG_LEVEL
              Value: 1
            - Name: HOST 
              Value: 0.0.0.0
            - Name: HTTP_PORT
              Value: 8181
          PortMappings:
            - ContainerPort: 8181
          LogConfiguration:
            LogDriver: awslogs
            Options:
              awslogs-region: !Ref AWS::Region
              awslogs-group: !Ref LogGroup
              awslogs-stream-prefix: ecs
        - 
          Name: encyou
          Image:   gcr.io/xxxx3
          DependsOn:
            - Condition: START
              ContainerName: engine
          LogConfiguration:
            LogDriver: awslogs
            Options:
              awslogs-region: !Ref AWS::Region
              awslogs-group: !Ref LogGroup
              awslogs-stream-prefix: ecs
        - 
          Name: packager
          Image:   gcr.io/xxxxx
          DependsOn:
            - Condition: START
              ContainerName: engine
          LogConfiguration:
            LogDriver: awslogs
            Options:
              awslogs-region: !Ref AWS::Region
              awslogs-group: !Ref LogGroup
              awslogs-stream-prefix: ecs
      RequiresCompatibilities:
        - EC2

  Service:
    Type: AWS::ECS::Service
    DependsOn: ContainerInstance
    Properties:
      ServiceName: ServiceName
      Cluster: !Ref Cluster
      DeploymentConfiguration:
        MaximumPercent: 200
        MinimumHealthyPercent: 75
      DesiredCount: 2
      TaskDefinition: !Ref 'TaskDefinition'
      LaunchType: EC2 
  

Я бы увидел, что служба, хотя это ресурс, который застрял, будет успешно зарегистрирована в кластере, а задачи — нет.

Есть идеи, что я делаю не так?

Ответ №1:

Кажется, вы используете неправильные имена кластеров. Ваш кластер будет просто вызван ClusterName , а не TestCluster . Впоследствии ваш экземпляр будет пытаться зарегистрироваться в несуществующем кластере.

Это потому, что вместо:

 ClusterName: ClusterName
  

должно быть:

 ClusterName: !Ref ClusterName
  

Пожалуйста, обратите внимание, что могут быть другие проблемы, которые пока не очевидны. Более того, вы используете пользовательские изображения gcr.io/xxxxx witch не позволяет повторно создавать возможные проблемы.

Комментарии:

1. Я внес изменения, и экземпляр EC2 теперь появляется в кластере. К сожалению, задачи по-прежнему отсутствуют в кластере и «создать сервис». Я также внес обновления в то, как я распределял процессор и хранилище между контейнерами.

2. Вы можете попробовать запустить с изображением nginx, чтобы повторить проблему.

3. @Paschal Может быть много причин. Ваш вопрос не дает много информации. Например, используете ли вы VPC по умолчанию или пользовательский vpc? Если пользовательский, правильно ли он настроен для разрешения доступа в Интернет. Какой экземпляр вы используете в своих тестах? Если он слишком мал, на нем не поместятся задачи.