ECS Fargate 컨테이너에 SSH로 연결하는 방법
12010 단어 serverlesscloudawsdocker
문제
모범 사례에 따르면 컨테이너에 SSH로 연결하면 안 됩니다. 대신 모니터링, 디버깅 및 로그 분석을 위한 적절한 관찰 가능성 메커니즘을 구현해야 합니다. 따라서 적어도 2021년 3월 16일까지는 ECS로는 불가능했습니다. 그 후 AWS 컨테이너 로드맵에서 요청이 많았던 기능이었습니다. AWS는 엔지니어가 개발 초기 단계에서 빠르게 디버그하고 테스트할 수 있어야 한다는 것을 이해했기 때문에 결국 포기했습니다. 또한 프로덕션에서 심각도가 높은 문제를 디버깅하는 데 도움이 될 수 있습니다.
해결책
ECS 컨테이너에 들어가기 전에 SSH 포트를 열고 호스트 인스턴스에 대한 키/비밀번호를 가져와서 해당 인스턴스에 SSH를 적용한 다음
docker exec
컨테이너에 연결해야 합니다. 서버리스 Fargate 모델을 실행 중인 경우 호스트 시스템에 대한 액세스 권한이 없기 때문에 이 작업을 수행할 수도 없으므로 이를 EC2 인스턴스에 재배포해야 합니다.그런 다음 ECS exec가 구조에 나섰고 이를 통해 SSH 키 또는 암호 배포와 관련된 보안 문제에 대해 걱정하는 오버헤드 없이 원하는 컨테이너에 바로 들어갈 수 있습니다
docker exec
.구현
CloudFormation 템플릿의 특정 부분에서 Fargate 컨테이너를 사용하고 수정하겠습니다.
템플릿에는 이미 퍼블릭 서브넷에 클러스터가 있으므로 먼저 IAM 정책을 추가합니다.
TaskRole:
Type: AWS::IAM::Role
Properties:
RoleName: !Join ["-", [!Ref ServiceName, TaskRole]]
AssumeRolePolicyDocument:
Statement:
- Effect: Allow
Principal:
Service: ecs-tasks.amazonaws.com
Action: "sts:AssumeRole"
Policies:
- PolicyName: "systems-manager"
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: "Allow"
Action:
- "ssmmessages:CreateControlChannel"
- "ssmmessages:CreateDataChannel"
- "ssmmessages:OpenControlChannel"
- "ssmmessages:OpenDataChannel"
Resource: "*"
- Effect: "Allow"
Action:
- "kms:Decrypt"
Resource: !Ref KMSKey
그런 다음 KMS 키:
############################################################
# KMS KEY
############################################################
KMSKey:
Type: AWS::KMS::Key
Properties:
Description: Key needed to encrypt docker exec data channel
KeyPolicy:
Version: "2012-10-17"
Statement:
- Effect: "Allow"
Principal:
AWS: !Sub "arn:aws:iam::${AWS::AccountId}:root"
Action:
- "kms:*"
Resource: "*"
이제 서비스에서 exec 명령을 활성화합니다. 이는
EnableExecuteCommand: true
를 추가하여 수행할 수 있습니다. ############################################################
# ECS SERVICE
############################################################
Service:
Type: AWS::ECS::Service
# This dependency is needed so that the load balancer is setup correctly in time
DependsOn:
- ApplicationLoadBalancer
- ALBHTTPListener
- ListenerRule
- TargetGroup
Properties:
ServiceName: !Ref ServiceName
Cluster: !Ref Cluster
TaskDefinition: !Ref TaskDefinition
EnableExecuteCommand: true
DeploymentConfiguration:
MinimumHealthyPercent: 100
MaximumPercent: 200
DesiredCount: !Ref MinContainers
HealthCheckGracePeriodSeconds: 300
LaunchType: FARGATE
NetworkConfiguration:
AwsvpcConfiguration:
AssignPublicIp: ENABLED
Subnets:
- !Ref PublicSubnetOne
- !Ref PublicSubnetTwo
SecurityGroups:
- !Ref ContainerSecurityGroup
LoadBalancers:
- ContainerName: !Ref ServiceName
ContainerPort: !Ref ContainerPort
TargetGroupArn: !Ref TargetGroup
template을 배포할 수 있습니다.
aws cloudformation deploy --template-file ecs.yml --stack-name ecs-infrastructure --capabilities CAPABILITY_NAMED_IAM --profile default
그런 다음 다음을 실행하여 작업 ID를 얻을 수 있습니다.
aws ecs list-tasks --cluster rest-api-cluster
작업 ID는 아래 빨간색으로 강조 표시된 부분입니다.
이것은 알파인 리눅스 도커 이미지이므로
"/bin/bash"
대신 docker exec에 "/bin/sh"
를 사용해야 합니다.aws ecs execute-command --region us-east-1 --cluster rest-api-cluster --task INSERT_YOUR_TASK_ID_HERE --container rest-api --command "/bin/sh" --interactive
샘플 출력:
this tool을 사용하여 문제를 해결할 수 있습니다.
대청소
필요하지 않은 리소스를 삭제하는 것을 항상 기억하고 다음을 실행하십시오.
aws cloudformation delete-stack --stack-name ecs-infrastructure
스택 상태를 확인하여 성공적으로 삭제되었는지 확인할 수 있습니다.
aws cloudformation describe-stacks --stack-name ecs-infrastructure
스택이 성공적으로 삭제되었는지 확인합니다. 구현한 경우 ECR 저장소를 정리해야 합니다.
Reference
이 문제에 관하여(ECS Fargate 컨테이너에 SSH로 연결하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/femilawal/how-to-ssh-into-an-ecs-fargate-container-1l3k텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)