ECS Fargate 컨테이너에 SSH로 연결하는 방법

문제



모범 사례에 따르면 컨테이너에 SSH로 연결하면 안 됩니다. 대신 모니터링, 디버깅 및 로그 분석을 위한 적절한 관찰 가능성 메커니즘을 구현해야 합니다. 따라서 적어도 2021년 3월 16일까지는 ECS로는 불가능했습니다. 그 후 AWS 컨테이너 로드맵에서 요청이 많았던 기능이었습니다. AWS는 엔지니어가 개발 초기 단계에서 빠르게 디버그하고 테스트할 수 있어야 한다는 것을 이해했기 때문에 결국 포기했습니다. 또한 프로덕션에서 심각도가 높은 문제를 디버깅하는 데 도움이 될 수 있습니다.

해결책



ECS 컨테이너에 들어가기 전에 SSH 포트를 열고 호스트 인스턴스에 대한 키/비밀번호를 가져와서 해당 인스턴스에 SSH를 적용한 다음docker exec 컨테이너에 연결해야 합니다. 서버리스 Fargate 모델을 실행 중인 경우 호스트 시스템에 대한 액세스 권한이 없기 때문에 이 작업을 수행할 수도 없으므로 이를 EC2 인스턴스에 재배포해야 합니다.


그런 다음 ECS exec가 구조에 나섰고 이를 통해 SSH 키 또는 암호 배포와 관련된 보안 문제에 대해 걱정하는 오버헤드 없이 원하는 컨테이너에 바로 들어갈 수 있습니다docker exec.

구현



CloudFormation 템플릿의 특정 부분에서 Fargate 컨테이너를 사용하고 수정하겠습니다.
  • 작업 역할에 대한 IAM 정책
  • ECS Exec 데이터 채널을 암호화하는 KMS 키
  • 실행 명령 활성화
  • 퍼블릭 서브넷에 클러스터 배치
    템플릿에는 이미 퍼블릭 서브넷에 클러스터가 있으므로 먼저 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 저장소를 정리해야 합니다.

    좋은 웹페이지 즐겨찾기