ECS(Elastic Container Services) 是 AWS 上的服务,可以运行Docker。
ECS的运行方式如下
- 创建TaskDefinition:指定cpu,内存和ecr镜像地址,执行的命令,可以跑多个container
- 在运行时,通过boto3调用时,选定一个集群,并设置安全组和启动方式
基于无服务的ECS运行需要下列条件:
- 启动方式为Fargate
- 运行时要选定一个Cluster,需要提前创建
有一个CloudWatch Logs的log group,用于存储运行log
- 如果是手动在console上创建TaskDefinition,会自动创建log group
- 如果是通过boto3创建的,需要手动创建log group
所以,通过boto3创建task definition,需要
创建log group
需要设定的参数:
log_group_name
:CloudWatch上的log group名字,用于创建log group
import boto3
import botocore
log_group_name = '/ecs/test-ecs2' # CloudWatch上的log group名字,用于创建log group
client = boto3.client('logs')
try:
response = client.create_log_group(
logGroupName=log_group_name,
)
print(response)
except Exception as e:
if 'ResourceAlreadyExistsException' in str(e):
print('Log Group already existed')
else:
print(e)
创建Task Definition
接下来,开始创建 Task Definition:
需要指定下列参数:
task_name
:TaskDefinition的名字log_group_name
:Task log地址stream_prefix
:log group流的prefixcmd
:入口命令,Docker实际执行的命令,是一个list,把空格分割用list代替,例如echo 123
为['echo', '123']
image
:镜像在ECR上的路径task_role_arn
和execution_role_arn
:区别暂时不清楚,先用同一个,要给AmazonECSTaskExecutionRolePolicycpu
:cpu数,每1024为1核,最高4核,必须是字符串memory
:memory 30720为30G,最高30G,必须是字符串
import boto3
task_name = 'test-task-name' # TaskDefinition的名字
log_group_name = '/xxx-ecs/test-ecs-log' # CloudWatch上的log group名字,用于创建log group
region = 'us-east-1' # log group所在的region
stream_prefix = 'ecs' # log group流的prefix
cmd = ['./run.sh', 'param1', 'param2'] # CMD命令,Docker实际执行的命令
image = '123456.dkr.ecr.us-east-1.amazonaws.com.cn/ecr/docker-name' # 镜像在ECR上的路径
task_role_arn = 'arn:aws-cn:iam::123456:role/role_name' # Task Role,要给AmazonECSTaskExecutionRolePolicy
execution_role_arn = 'arn:aws-cn:iam::123456:role/role_name' # Task Role,要给AmazonECSTaskExecutionRolePolicy
cpu = str(4096) # cpu数,每1024为1核,最高4核
memory = str(30720) # memory 30720为30G,最高30G
client = boto3.client('ecs')
response = client.register_task_definition(
family=task_name,
taskRoleArn=task_role_arn,
executionRoleArn=execution_role_arn,
networkMode='awsvpc',
containerDefinitions=[
{
'name': 'container1',
'image': image,
'command': cmd,
'logConfiguration': {
'logDriver': 'awslogs',
'options': {
'awslogs-region' : region,
'awslogs-group' : log_group_name,
'awslogs-stream-prefix': stream_prefix
}
},
},
],
requiresCompatibilities=[
'FARGATE',
],
cpu=cpu,
memory=memory
)
启动Task Definition
启动ECS Task Definition
import json
import boto3
def lambda_handler(event, context):
client = boto3.client('ecs')
cluster = 'CLUSTER-NAME'
task_name = 'test-task-name'
subnets = ['subnet-xxx']
security_groups = ['sg-xxx']
response = client.run_task(
cluster=cluster,
taskDefinition=task_name,
count=1,
launchType='FARGATE',
networkConfiguration={
'awsvpcConfiguration': {
'subnets': subnets,
'securityGroups': security_groups,
'assignPublicIp': 'ENABLED'
}
}
)