AWS Fargate를 Terraform으로 구축

re:Invent 2017에서 컨테이너 인스턴스가 필요없는 컨테이너 관리 서비스 (Fargate)가 AWS에서 발표되었으므로 시도해 보겠습니다.
Terraform에서 VPC에서 단번에 작성해 갑니다.
2018/2/15 시점에서는 도쿄 리전 미대응이므로, 버지니아 리전에서 실행합니다.

작성 후의 이미지 (Fargate)



관리 콘솔에서 EC2가 존재하지 않는지 확인하고 싶습니다.



이전 이미지(ECS)



차이는 컨테이너 인스턴스의 유무만
계속해서 VPC/Subnet/ALB 등의 NetWork 주위의 설정은 필수



ECS 프로비저닝 파일과의 변경 사항


  • 인스턴스 구성이 더 이상 필요하지 않아 Auto Scale 관련 파일 삭제
  • Task 정의

  • terrafrom
      requires_compatibilities = ["FARGATE"]
      network_mode             = "awsvpc"
      execution_role_arn       = "arn:aws:iam::${var.aws_id}:role/ecsAdminRole" #AWS標準ECS関連のポリシーAmazonECSTaskExecutionRolePolicy/AmazonECS_FullAccessを含む
      cpu                      = 256 #Fargate準拠の組み合わせのみ指定可能
      memory                   = 512 #Fargate準拠の組み合わせのみ指定可能
    

    task_definition.json
    [
      {
        "name": "nginx",
        "image": "nginx:alpine",
        "cpu": 256, //必要に応じ変更
        "memory": 512, //必要に応じ変更
        "essential": true,
        "network_mode": "awsvpc", //追加 
        "portMappings": [
          {
            "containerPort": 80
          }
        ],
        "logConfiguration": {
            "logDriver": "awslogs",
            "options": {
                "awslogs-group": "awslogs-${app_name}-nginx-log",
                "awslogs-region": "${aws_region}",
                "awslogs-stream-prefix": "awslogs-${app_name}-nginx"
            }
        }
      }
    ]
    

    CPU/Memory의 조합은 이쪽
  • ALB Target Group

  • 이하 추가
       target_type = "ip"
    
  • ECS Service

  • IAM 삭제
    NetWork 설정을 Auto Scale에서 이전

    diff
    -  iam_role                           = "ecsServiceRole"
    +  launch_type                        = "FARGATE"
    
    +  launch_type = "FARGATE"
    +
    +  network_configuration {
    +    subnets = [
    +      "${aws_subnet.public-subnet1.id}",
    +      "${aws_subnet.public-subnet2.id}"
    +    ]
    +
    +    security_groups = [
    +      "${aws_security_group.public_firewall.id}"
    +    ]
    +    assign_public_ip = "true"
    +  }
    

    Terraform 실행


  • Terraform 버전
  • $ terraform --version
    Terraform v0.11.3
    + provider.aws v1.9.0
    + provider.template v1.0.0
    
  • GitHub



  • bush
    ## Dry Run
    terraform plan -var 'aws_id=[AWS Account Idを記載]'
    
    ## apply
    terraform apply -var 'aws_id=[AWS Account Idを記載]'
    
    ## 削除
    terraform destroy -var 'aws_id=[AWS Account Idを記載]'
    


    ※추기(2018/02/15):
    provider.aws v1.9.0에서 ECS Service의 공용 IP 자동 할당 기능이 지원되었으므로 내용이 수정되었습니다.

    ## CannotPullContainerError

    apply 는 성공합니다만, 서비스 등록한 태스크가 오르지 않습니다.
    오류 원인은 Docker Image가 풀 수 없는 것 같습니다.

    원인은 Auto-assign public IPDISABLED이므로 인터넷에 연결할 수 없습니다.
    ( provider.aws v1.6.0 에서는 Auto-assign public IP 는 미 대응 ※2018/1/10 시점)

    ## AWS CLI로 네트워크 설정 조정

    + ecs updatae-service에서 Auto-assign public IP에서 ENABLED

    작업이 RUNNING입니다.
    # network-configurationでassignPublicIp=ENABLEDにupdate
    $ aws ecs update-service \
      --cluster fargate-auth \
      --service fargate-auth-service \
      --network-configuration "awsvpcConfiguration={subnets=[subnet-xxxxxxx,subnet-xxxxxx],securityGroups=[sg-xxxxxxx],assignPublicIp=ENABLED}"
    

    마지막으로



    컨테이너 인스턴스가 관리 콘솔에 존재하지 않는 것도 무사히 확인할 수 있었습니다.
    다음 번 는 오토 스케일을 사용해보고 싶습니다.

    좋은 웹페이지 즐겨찾기