ECS의 ENI 상한 인상

4124 단어 도커ECSAWS

ECS with awsvpc on EC2



10년만에 쓰기 때문에 어조를 잊었습니다. 옛 기사와 달리 죄송합니다.

TL;DR



ENI 상한을 늘리려면 기본 awsvpcTrunking을 enabled로 설정하면 됩니다.

EC2 vs Fargate



ECS는 VPC 네트워킹 (awsvpc)에서 사용하는 것이 더 편하고 VPC를 사용하는 경우 Fargate를 사용하는 것이 더 쉽습니다.
다만, 굳이 고난의 길을 선택해 EC2 컨테이너 인스턴스를 사용하는 메리트도 물론 있습니다.

EC2의 장점



Fargate보다 저렴



Fargate가 가격 인하되었기 때문에 지금은 변하지 않을지도.

로그 드라이버에 awslogs 이외를 선택할 수 있다



Fargate라면 awslogs밖에(splunk도 선택할 수 있게 되었지만) 선택할 수 없습니다.
특히 디버깅 할 때 cloudwatch를 보는 것은 매우 어려우므로 jsonfile과 fluentd를 사용하고 싶습니다.

docker exec으로 안에 넣기



컨테이너 인스턴스에 ssh하여 docker exec 로 컨테이너 안에 들어갈 수 있습니다.
Fargate에서는 할 수 없습니다만, 장래 ssh 할 수 있게 한다고 하는 계획이 발표되고 있는 것 같기 때문에 지금만일지도.

이번 제품의 경우, 프로덕션 운용은 Fargate로, 스테이징 환경을 EC2로 하기로 했습니다.

ENI 상한



그런데 네트워킹을 bridge로 하면 같은 인스턴스에서 달리는 컨테이너끼리 포트가 부딪치지 않도록 궁리해야 합니다.
특히 마이크로서비스화 되고 있는 경우, 이것은 매우 할 수 없네요.
VPC를 사용하면 포트는 사용하고 싶은 무제한(단 외부와의 접속은 로드 밸런서를 경유할 필요가 있다), 같은 태스크내의 컨테이너끼리도 localhost로 교환할 수 있습니다.
하지만 VPC의 경우 컨테이너마다 ENI(Elastic Network Interface)가 할당되며, 그 상한은 EC2 인스턴스마다 정해져 있습니다.
상한이 large 인스턴스에서도 2개라든지이므로, 현실적으로 VPC로의 운용은 불가능합니다.
그리고 이 상한을 대폭 완화하는 옵션이 있어, awsvpcTrunking 라고 하는 것을 유효하게 하면 단번에 5배 정도로 완화됩니다.large 인스턴스에서 10개가 되기 때문에 이것이라면 보통으로 운용할 수 있을 것입니다.

상한 완화 방법



console의 ECS 메뉴에 Account Settings라는 것이 있습니다.



이 안에 awsvpcTrunking 라는 항목이 있고, 이것을 체크하면 유효하게 됩니다.



와우 간단.

라고 생각해. 설명을 잘 읽어보자.



여기를 확인해도 자신의 역할에만 유효하므로 ECS의 서비스 역할에 대해? awsvpcTrunking을 활성화해야하는 것 같습니다.
그래서 서비스 역할에 부여해 보겠습니다.
aws ecs put-account-setting --name awsvpcTrunking --value enabled --principal-arn arn:aws:iam::xxxx:role/aws-service-role/ecs.amazonaws.com/AWSServiceRoleForECS

하지만 루트 계정이 아니면 서비스 역할에 권한을 부여할 수 없다고 합니다.

(왠지 복잡한) 문서 을 읽으면, コマンドラインを使用して、引き上げられた ENI 制限にアカウントのすべての IAM ユーザーまたはロールをオプトインするには 라는 항목이 있어, 모든 롤에 대해서 유효하게 할 수 있는 것 같습니다.
해보겠습니다.
aws ecs put-account-setting-default --name awsvpcTrunking --value enabled

할 수 있었습니다.
사용하도록 설정한 후 시작한 인스턴스만 awsvpcTrunking을 사용하도록 설정했습니다.

확인



화면에서 알 수 없다.



(이 "포트"가 늘어나지 않는 것 같습니다)

aws-sdk로 확인
% aws ecs list-attributes --cluster hoge-cluster --target-type container-instance --attribute-name ecs.awsvpc-trunk-id
{
    "attributes": [
        {
            "name": "ecs.awsvpc-trunk-id",
            "value": "xxxx",
            "targetId": "arn:aws:ecs:ap-northeast-1:xxxx:container-instance/xxxx"
        }
    ]
}

시험에 태스크를 대폭 늘려 보았는데 제대로 달렸기 때문에 성공한 것 같습니다.

좋은 웹페이지 즐겨찾기