Fargate의 컨테이너로 OS 명령이나 ssh로 들어가고 싶다!! 그것 ssm-agent로 해결할 수 있습니다

Fargate 편리하네요. 번거로운 인스턴스 관리에서 개방시켜 신속하게 환경을 준비할 수 있습니다.
하지만 ECS와 달리 한 가지 큰 문제가 있습니다.

docker exec 또는 SSH를 실행할 수 없습니다!



EC2에 익숙한 사람에게는 SSH로 조사할 수 없는 것은 조금 흠. . . . 라고 생각합니다. (얼마나 자신은 그랬습니다)
그렇게 할 수 없습니까? 그렇다면 그렇지 않은 것 같고 몇 가지 방법은 있는 것 같습니다.
  • SSH 환경을 설정하고 거기에서 컨테이너로 들어가기
  • ssm-agent를 통해 컨테이너에 들어가기

  • SSH의 환경을 정돈해도 괜찮습니다만, 그것이라고 모처럼의 안전한 환경이 물론 없기 때문에 이번은 ssm-agent를 경유한 컨테이너의 들어가는 방법을 구축했으므로 메모 대신에 남겨 둡니다.

    환경


  • AWS Fargate

  • 참고한 기사



  • [AWS ECS] Fargate의 컨테이너에 쉘로 들어가고 싶다 (sshd없이!)
  • 이것 밖에 괜찮은 정보가 없었기 때문에 살아났습니다!!


  • 할 일


  • DockerImage에 ssm-agent 설치
  • Systems manager의 하이브리드 활성화 기능을 사용하여 컨테이너를 관리합니다.
  • ssm-agent 시작 명령을 사용하여 관리합니다.
  • Systems Manager 세션 시작 및 실행 명령이 가능한지 확인합니다.

    Dockerfile에 ssm-agent를 설치하는 프로세스 추가



    이번 컨테이너에는 nodeJS 컨테이너에 Python이 없었기 때문에 Python 설치도 포함되어 있습니다 (ssm-agent가 Python을 사용하기 때문에).

    Dockerfile
    FROM node:10.16.3-stretch-slim
    
    RUN apt-get update && apt-get install -y \
        curl \
     && apt-get clean \
    
    # Python Install
    RUN apt-get update && apt install -y \
        zlib1g-dev \
        libssl-dev \
        libreadline-dev \
        libsqlite3-dev \
        libbz2-dev \
        libncurses5-dev \
        libgdbm-dev \
        liblzma-dev \
        tk-dev zlibc \
        libffi-dev \
        zip \
        unzip \
     && apt-get clean \
     && curl https://www.python.org/ftp/python/3.7.5/Python-3.7.5.tgz | tar zx -C /usr/local/src/ \
     && cd /usr/local/src/Python-3.7.5 \
     && ./configure \
     && make && make install \
     && ln -s /usr/local/bin/python3 /usr/local/bin/python
    
    RUN curl https://s3.ap-northeast-1.amazonaws.com/amazon-ssm-ap-northeast-1/latest/debian_amd64/amazon-ssm-agent.deb -o /tmp/amazon-ssm-agent.deb \
        && dpkg -i /tmp/amazon-ssm-agent.deb \
        && cp /etc/amazon/ssm/seelog.xml.template /etc/amazon/ssm/seelog.xml
    

    AWS Systems Manager 정품 인증을 사용하여 컨테이너 인스턴스를 관리형 인스턴스로 만들기



    이 활성화라는 기능이 잘 되어 있는 녀석으로 물리적인 온프레미스 인스턴스나 라즈파이, 로컬의 docker등 ssm-agent가 있으면 ssm-agent 경유로 Systems Manager의 기능을 사용할 수 있습니다.

    다만 주의 사항으로 EC2등은 AWS의 관리화에 놓여져 있는 인스턴스이므로 요금은 들지 않습니다만
    다른 서버를 등록하면 시간당 요금이 발생합니다.

    Systems Manager# 온프레미스 인스턴스 관리

    평가할 때 ssm-agent를 통해 관리형 인스턴스에 등록할 때
    【計算式】料金      = (マネージドインスタンス管理時間単価 x 24(時間)× 日数
    【コスト】5.004 USD = (0.00695 x 24) x 30
    

    1 컨테이너 태스크 당 월액 약 5 USD 정도 걸리므로주의하시기 바랍니다.

    시작 스크립트 작성



    이런 느낌의 기동 스크립트를 기재합니다

    start.sh
    #! /usr/bin/env bash
    
    set -e
    
    if [ "$SSM_ACTIVATE" = "true" ]; then
      ACTIVATE_PARAMETERS=$(aws ssm create-activation \
        --default-instance-name "$RESOURCE_STAGE-$SERVICE_NAME-$RESOURCE_VERSION" \
        --description "$RESOURCE_STAGE-$SERVICE_NAME-$RESOURCE_VERSION" \
        --iam-role "service-role/AmazonEC2RunCommandRoleForManagedInstances" \
        --registration-limit 5)
    
      export ACTIVATE_CODE=$(echo $ACTIVATE_PARAMETERS | jq -r .ActivationCode)
      export ACTIVATE_ID=$(echo $ACTIVATE_PARAMETERS | jq -r .ActivationId)
      amazon-ssm-agent -register -code "${ACTIVATE_CODE}" -id "${ACTIVATE_ID}" -region "ap-northeast-1" -y
      nohup amazon-ssm-agent > /dev/null &
    fi
    .
    .
    ## この後にコンテナで実行したい処理を記載する
    

    설치된 ssm-agent 명령을 사용하여 관리하면 이러한 방식으로 등록된 인스턴스로 등록됩니다.



    ECS Task Definitions 수정



    TaskRole은
  • AmazonSSMManagedInstanceCore
  • AmazonSSMAutomationRole
  • AmazonSSMDirectoryServiceAccess

  • 최소한 필요합니다

    CloudFormation에 기재되어 있지만 원하는 형태로 적절히 수정하십시오.

    template.yml
    Parameters:
      TaskDefinitionEnvSSMActivate:
        Type: String
        Description: true is ssma-agent start mode task definitions
        Default: true
    
    Resources:
      ECSTaskRole:
        Type: AWS::IAM::Role
        Properties:
          RoleName: "{your role name}"
          Path: /
          AssumeRolePolicyDocument:
            Statement:
              - Effect: Allow
                Principal:
                  Service: [ "ecs-tasks.amazonaws.com" ]
                Action: sts:AssumeRole
              - Effect: Allow
                Principal:
                  Service: [ "ssm.amazonaws.com" ]
                Action: sts:AssumeRole
    
          ManagedPolicyArns:
            - arn:aws:iam::aws:policy/service-role/AmazonSSMAutomationRole
            - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
            - arn:aws:iam::aws:policy/AmazonSSMDirectoryServiceAccess
    
      ECSTaskDefinition:
        Type: "AWS::ECS::TaskDefinition"
        Properties:
          Cpu: {your vCPU}
          Memory: {your Memory}
          ExecutionRoleArn: {yourExecutionRoleArn}
          TaskRoleArn: !GetAtt ECSTaskRole.Arn
          Family: {Your family name}
          NetworkMode: awsvpc
          RequiresCompatibilities:
            - FARGATE
          ContainerDefinitions:
            - Name: {your container name}
              Image: !Sub
                - "${AWS::AccountId}.dkr.ecr.ap-northeast-1.amazonaws.com/${ECRRepository}"
              Environment:
                - Name: SSM_ACTIVATE
                  Value: !Ref TaskDefinitionEnvSSMActivate
                - Name: SERVICE_NAME
                  Value: !Ref ServiceName
                - Name: RESOURCE_STAGE
                  Value: !Ref Prefix
                - Name: RESOURCE_VERSION
                  Value: !Ref CFVersion
                - Name: SERVICE_STAGE
                  Value: !Ref ServiceStage
    
              Command: [ "sh", "start.sh" ]
              LogConfiguration:
                LogDriver: awslogs
                Options:
                  awslogs-group: !Ref ECSTaskLogGroup
                  awslogs-region: !Ref AWSLogRegion
                  awslogs-stream-prefix: "ecs"
              MemoryReservation: 128
              PortMappings:
                - HostPort: 80
                  Protocol: tcp
                  ContainerPort: 80
                - HostPort: 10443
                  Protocol: tcp
                  ContainerPort: 10443
    

    발췌했지만
    * Environment SSM_ACTIVATE 플래그로 시작 컨테이너의 ssm-agent 모드에서 시작 여부를 처리합니다.

    기본값은 false로 작동하고 문제 해결을 원한다면 true로 플래그를 지정하고 실행하는 전략입니다.

    연결로 보기



    그럼이 상태에서
  • 세션 관리자
  • 명령 실행

  • 해보자.

    등록한 인스턴스는 하이브리드 정품 인증에서 정품 인증 ID를 복사합니다.
    검색을 하면 알 수 있습니다.





    이제 연결할 수 있습니다.

    보충: 테스트가 완료된 후 관리형 인스턴스 청소



    aws-cli로 갈 수 있습니다.
    aws ssm delete-activation --activation-id {ActivateId}
    aws ssm deregister-managed-instance --instance-id "mi-12345abcd"
    

    마지막으로



    마지막 수단으로 사용하는 처리이므로 항상. 보다는 아무래도 곤란하면 실행하는 수단으로서 기억해 두면 좋네요.

    좋은 웹페이지 즐겨찾기