使用ECS在AWS上运行Docker容器

时间:2020-02-23 14:31:48  来源:igfitidea点击:

ECS代表弹性容器服务。
它是可以运行docker容器的托管容器服务。
尽管AWS还使用Kubernetes(EKS)提供了容器管理,但它也有其专有的解决方案(ECS)。
该教程将涵盖以下内容:创建ECS群集,提供镜像注册表(ECR)并将docker镜像推送到注册表,使用任务和服务定义将容器部署到群集,创建管道以更新ECS群集上运行的服务。

本教程将介绍如何创建ECS集群。

要求/准备工作

在继续阅读本教程之前,读者/用户必须具有:

一个AWS账户。
在该账户上创建一个用户,以允许对该账户进行资源调配;生成一个EC2 SSH密钥对;创建一个VPC和子网(可选)。
在以下链接上找到:使用CloudFormation创建AWS VPC

创建AWS ECS集群

我们可以创建两种类型的ECS集群。
带Fargate集群的ECS:该集群允许用户运行容器,而无需担心配置和管理EC2实例/服务器。
它基本上是一种无服务器的体系结构。
带有EC2实例集群的ECS:该集群允许用户在预配置的EC2实例上运行容器。
因此需要管理服务器。

使用Fargate选项创建AWS ECS集群

要创建集群,我们可以使用CloudFormation或者Terraform手动或者自动进行。
对于本文,我将使用CloudFormation手动创建集群。

CloudFormation:

下面的CloudFormation模板创建了一个具有容量提供商的ECS集群,并启用了Fargate和Container Insights。
读者应修改模板设置以自定义其特定要求。
更改的主要方面将是:标签。
群集设置。

AWSTemplateFormatVersion: "2010-09-09"
Description: "Create ECS fargate cluster"
Parameters:
    Name:
        Type: String
        Description: The name of the ECS Cluster
Resources:
    ECSCluster:
        Type: 'AWS::ECS::Cluster'
        Properties:
           ClusterName: !Ref Name
           ClusterSettings:
             - Name: containerInsights
               Value: enabled
           CapacityProviders:
             - FARGATE
           Tags: 
              - 
                Key: "Name"
                Value: "test-ecs"
              - 
                Key: "CreatedBy"
                Value: "Maureen Barasa"
              - 
                Key: "Environment"
                Value: "test"
Outputs:        
    ECS:
        Description: The created ECS Cluster
        Value: !Ref ECSCluster

手动:

要手动创建集群,请执行以下步骤。
在Elastic Container Services控制台上,单击创建集群。

然后,对于群集模板,选择Powered by Fargate作为选项。
单击下一步。

最后,配置群集设置,然后单击创建群集。
N/B:我们可以为集群创建一个新的VPC。
但这是可选的。

现在,ECS Fargate集群正在运行。

使用EC2选件创建AWS ECS集群

我们还可以使用CloudFormation,Terraform或者手动执行此操作。

CloudFormation:

对于CloudFormation,请使用以下模板。

AWSTemplateFormatVersion: "2010-09-09"
Description: "Create ECS fargate cluster"
Parameters:
    Name:
        Type: String
        Description: The name of the ECS Cluster
    VPC:
        Type: String
        Description: The vpc to launch the service
        Default: vpc-ID
    PrivateSubnet01:
        Type: String
        Description: The subnet where to launch the ecs instances
        Default: subnet-ID
    PrivateSubnet02:
        Type: String
        Description: The subnet where to launch the ecs instances
        Default: subnet-ID
    InstanceType:
        Type: String
        Description: The EC2 instance type
        Default: "t2.micro"
    MinSize:
        Type: String
        Description: The subnet where to launch the ec2
        Default: 1
    MaxSize:
        Type: String
        Description: The subnet where to launch the ec2
        Default: 2
    DesiredSize:
        Type: String
        Description: The subnet where to launch the ec2
        Default: 1
Resources:
    IAMInstanceRole:
        Type: 'AWS::IAM::Role'
        Properties:
          Description: The ECS Instance Role
          RoleName: ecsInstanceRole2
          AssumeRolePolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Principal:
                  Service:
                  - ec2.amazonaws.com
                Action:
                  - 'sts:AssumeRole'
          ManagedPolicyArns:
            - arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role
            - arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy
            - arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess
          Tags: 
            - 
              Key: "Environment"
              Value: "test"
            - 
              Key: "createdBy"
              Value: "Maureen Barasa"
            - 
              Key: "Name"
              Value: "ecsInstanceRole2"
    IAMInstanceProfile:
        Type: AWS::IAM::InstanceProfile
        Properties: 
            InstanceProfileName: ecsInstanceRole2
            Roles: 
             - !Ref IAMInstanceRole
    ECSSecurityGroup:
        Type: "AWS::EC2::SecurityGroup"
        Properties:
            GroupDescription: "Security Group to control access to the ECS cluster"
            GroupName: "test-ECS-SG"
            VpcId: !Ref VPC
            SecurityGroupIngress: 
              - 
                CidrIp: 0.0.0.0/0
                FromPort: 80
                IpProtocol: "tcp"
                ToPort: 80
              - 
                CidrIp: 0.0.0.0/0
                FromPort: 443
                IpProtocol: "tcp"
                ToPort: 443 
            Tags: 
              - 
                Key: "Name"
                Value: "test-ECS-SG"
              - 
                Key: "CreatedBy"
                Value: "Maureen Barasa"
              - 
                Key: "Environment"
                Value: "test"        
    ECSCluster:
        Type: 'AWS::ECS::Cluster'
        Properties:
           ClusterName: !Ref Name
           ClusterSettings:
             - Name: containerInsights
               Value: enabled
           Tags: 
              - 
                Key: "Name"
                Value: "test-ecs"
              - 
                Key: "CreatedBy"
                Value: "Maureen Barasa"
              - 
                Key: "Environment"
                Value: "test"
    ECSAutoScalingGroup:
        Type: AWS::AutoScaling::AutoScalingGroup
        Properties:
            VPCZoneIdentifier: 
              - !Ref PrivateSubnet01
              - !Ref PrivateSubnet02
            LaunchConfigurationName: !Ref LaunchConfiguration
            MinSize: !Ref MinSize
            MaxSize: !Ref MaxSize
            DesiredCapacity: !Ref DesiredSize
            HealthCheckGracePeriod: 300
            Tags: 
              - 
                Key: "Name"
                Value: "test-ecs"
                PropagateAtLaunch: true
              - 
                Key: "CreatedBy"
                Value: "MaureenBarasa"
                PropagateAtLaunch: true
              - 
                Key: "Environment"
                Value: "test"
                PropagateAtLaunch: true
    LaunchConfiguration:
        Type: AWS::AutoScaling::LaunchConfiguration
        Properties:
            ImageId: "ami-ID"
            SecurityGroups: 
              - !Ref ECSSecurityGroup
            InstanceType: !Ref InstanceType
            IamInstanceProfile: !Ref IAMInstanceProfile
            KeyName: "test-key"
            UserData:
              Fn::Base64: !Sub |
                #!/bin/bash
                echo ECS_CLUSTER=test-ecs >> /etc/ecs/ecs.config;echo ECS_BACKEND_HOST= >> /etc/ecs/ecs.config;
            BlockDeviceMappings: 
              - 
                DeviceName: "/dev/xvda"
                Ebs: 
                    Encrypted: false
                    VolumeSize: 20
                    VolumeType: "gp2"
                    DeleteOnTermination: true
            
            
Outputs:
    IAMProfile:
        Description: The created EC2 Instance Role
        Value: !Ref IAMInstanceProfile
    AutoScalingGroup:
        Description: The ECS Autoscaling Group
        Value: !Ref ECSAutoScalingGroup    
    ECS:
        Description: The created ECS Cluster
        Value: !Ref ECSCluster

在模板的参数部分,输入集群的特定自定义输入。
其中包括:VPC和子网。
实例类型和Auto Scaling组的扩展要求。
在资源部分下。
请注意自定义:资源名称和标签。
EC2启动配置的密钥名称(使用我们生成的密钥对)。
EC2实例的AMI-ID。
(在账户上使用经过Amazon ECS优化的AMI)。
在CloudFormation完成执行堆栈之后,我们现在应该拥有一个带有已注册的活动EC2容器实例的ECS集群。
见下文:

手动:

要手动创建集群,请执行以下步骤:使用以下AWS托管策略创建ECS实例角色:AmazonS3ReadOnlyAccessCloudWatchAgentServerPolicyAmazon EC2ContainerServiceforEC2Role编辑角色信任关系并添加以下JSON信任策略。

{
  "Version": "2008-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

然后,在Elastic Container Service控制台上,单击"创建集群"。
这次在选择集群模板窗口上,而不是选择Powered by Fargate,而是选择EC2 Linux + Networking选项。
单击下一步。

接下来,我们需要配置集群。
关于集群配置,我们有3个主要部分:集群名称实例配置网络集群名称:

实例配置:

确保根据要求选择正确的实例配置。

其中有一个选项可以创建一个新的VPC,如果用户尚未创建自己的子网,则可以创建子网。
如果他们已经创建了网络体系结构,则读者可以使用现有的设置。
这同样适用于群集的安全组。
可以创建一个新角色,也可以选择一个现有角色。
然后,对于容器实例" IAM角色",选择我们在上面创建的角色。
通过选中启用容器洞察力旁边的框来启用容器洞察力。

最后单击,创建集群。
我们将在数分钟内启动并运行群集。