AWS ECS建立Fargate Container

2020/12/09

關於本篇

本篇為官方教學文件的實做過程紀錄

 

安裝ECS CLI

官方文件

 

sudo curl -Lo /usr/local/bin/ecs-cli https://amazon-ecs-cli.s3.amazonaws.com/ecs-cli-linux-amd64-latest
sudo chmod +x /usr/local/bin/ecs-cli
ecs-cli --version

 

設定ECS CLI

官方文件

 

設定CLI Profile

這邊是設定使用CLI的身份

可以想像同個電腦帳號中

你可能同時操作不同的CLI身份(CLI Profile對應到AWS IAM的帳號)

而你可能上班的時候操作公司的IAM帳號

下班操作自己的IAM帳號

所以設定這些Profile是必要的

讓我們在操作CLI任何操作的時候可透過--profile選項

選擇操作CLI的身份

ecs-cli configure profile \
  --profile-name <profile-name> \
  --access-key <aws-access-key-id> \
  --secret-key <aws-access-secret-key>

 

此步驟建立完成後

ECS CLI會將profile設定在~/.ecs/credentials檔案中

格式大致如下

version: v1
default: personal # 預設的使用的profile, 當沒設定--profile選項的時候使用此profile
ecs_profiles:
  personal:
    aws_access_key_id: aws_access_key_id1
    aws_secret_access_key: aws_secret_access_key1
  for-work:
    aws_access_key_id: aws_access_key_id2
    aws_secret_access_key: aws_secret_access_key2

 

設定CLI Cluster

基本上跟profile設定差不多

就是可以將常用的cluster先設定好

然後操作CLI的時候再指定用哪個cluster設定

參數說明

  • cluster-name: cluster名稱
  • default-launch-type: container啟動類型, 有FARGATEEC2兩種選項可使用
  • region: cluster region
  • config-name: 設定名稱, 也就是後須操作CLI要指定哪個cluster用的名稱
ecs-cli configure \
  --cluster <cluster-name> \
  --default-launch-type FARGATE \
  --region <region> \
  --config-name <config-name>

 

此步驟建立完成後

ECS CLI會將cluster設定在~/.ecs/config檔案中

格式大致如下

version: v1
default: ecs-demo
clusters:
  ecs-demo:
    cluster: ecs-demo
    region: ap-southeast-1
    default_launch_type: FARGATE

 

設定ECS CLI的IAM

官方文件

 

注意事項

此步驟為透過AWS CLI設定ECS CLI專用Role

因此要確保執行的AWS CLI的Profile IAM有以下權限

  • iam:CreateRole
  • iam:AttachRolePolicy

 

建立ecsTaskExecutionRole

透過官方提供的JSON檔範例

建立一個叫ecsTaskExecutionRole的IAM Role

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

 

透過AWS CLI執行

aws iam \
  --region ap-southeast-1 create-role \
  --role-name ecsTaskExecutionRole \
  --assume-role-policy-document file://task-execution-assume-role.json

 

將AmazonECSTaskExecutionRolePolicy掛上剛才新建的Role

這步驟設定好之後

AWS ECS的Task才能正常使用AWS API來存Log或是取Image等操作

如果此步驟出現Access Denied

代表目前操作AWS CLI的這個Profile IAM權限不足

沒有操作attache-role-policy的權限(前面注意事項提到的權限)

補上權限即可正常執行

aws iam \
  --region ap-southeast-1 attach-role-policy \
  --role-name ecsTaskExecutionRole \
  --policy-arn arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy

 

開始建立Cluster

指定前面ECS CLI設定的cluster name及profile-name

來建立cluster

ecs-cli up --cluster-config <cluster-name> --ecs-profile <profile-name>

 

另外官方教學會建立新的securtiy group

有需要的話再建即可

如果有符合的現成securtiy group可直接使用不一定要建立新的

 

佈署cluster

 

建立docker-compose.yml

直接使用官方文件提供的docker-compose.yml

version: '3'
services:
  web:
    image: amazon/amazon-ecs-sample
    ports:
      - "80:80"
    logging:
      driver: awslogs
      options: 
        awslogs-group: tutorial
        awslogs-region: us-west-2
        awslogs-stream-prefix: web

 

設定ecs-params.yml

這邊主要設定給ECS服務啟動使用的參數

詳細ecs-params.yml設定可查看官方文件

可以看到Role就是設定為剛才建立的ecsTaskExecutionRole

Network相關設定則可subnet、security group

version: 1
task_definition:
  task_execution_role: ecsTaskExecutionRole
  ecs_network_mode: awsvpc
  task_size:
    mem_limit: 0.5GB
    cpu_limit: 256
run_params:
  network_configuration:
    awsvpc_configuration:
      subnets:
        - "subnet ID 1"
        - "subnet ID 2"
      security_groups:
        - "security group ID"
      assign_public_ip: ENABLED

 

開始佈署cluster

ecs-cli compose \
  --project-name <project-name> service up \
  --cluster-config <cluster-config-name> \
  --ecs-profile <profile-name> \
  --create-log-groups

 

查看正在執行的container

ecs-cli compose --project-name <project-name> service ps --cluster-config <cluster-config-name> --ecs-profile <profile-name>

 

查看container log

ecs-cli logs --task-id <task-id> --follow --cluster-config <cluster-config-name> --ecs-profile <profile-name>

 

其他

刪除所有container

ecs-cli compose --project-name <project-name> service down --cluster-config <cluster-config-name> --ecs-profile <proflie-name>

 

刪除cluster

ecs-cli down --force --cluster-config <cluster-config-name> --ecs-profile <profile-name>