ECS의 ENI 상한 인상
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"
}
]
}
시험에 태스크를 대폭 늘려 보았는데 제대로 달렸기 때문에 성공한 것 같습니다.
Reference
이 문제에 관하여(ECS의 ENI 상한 인상), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/nysalor/items/a5a06013d1c37b096885
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
aws ecs put-account-setting --name awsvpcTrunking --value enabled --principal-arn arn:aws:iam::xxxx:role/aws-service-role/ecs.amazonaws.com/AWSServiceRoleForECS
aws ecs put-account-setting-default --name awsvpcTrunking --value enabled
% 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"
}
]
}
Reference
이 문제에 관하여(ECS의 ENI 상한 인상), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/nysalor/items/a5a06013d1c37b096885텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)