Fargate의 컨테이너로 OS 명령이나 ssh로 들어가고 싶다!! 그것 ssm-agent로 해결할 수 있습니다
15966 단어 CloudFormationFargateAWS
하지만 ECS와 달리 한 가지 큰 문제가 있습니다.
docker exec 또는 SSH를 실행할 수 없습니다!
EC2에 익숙한 사람에게는 SSH로 조사할 수 없는 것은 조금 흠. . . . 라고 생각합니다. (얼마나 자신은 그랬습니다)
그렇게 할 수 없습니까? 그렇다면 그렇지 않은 것 같고 몇 가지 방법은 있는 것 같습니다.
SSH의 환경을 정돈해도 괜찮습니다만, 그것이라고 모처럼의 안전한 환경이 물론 없기 때문에 이번은 ssm-agent를 경유한 컨테이너의 들어가는 방법을 구축했으므로 메모 대신에 남겨 둡니다.
환경
참고한 기사
[AWS ECS] Fargate의 컨테이너에 쉘로 들어가고 싶다 (sshd없이!)
할 일
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은
최소한 필요합니다
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"
마지막으로
마지막 수단으로 사용하는 처리이므로 항상. 보다는 아무래도 곤란하면 실행하는 수단으로서 기억해 두면 좋네요.
Reference
이 문제에 관하여(Fargate의 컨테이너로 OS 명령이나 ssh로 들어가고 싶다!! 그것 ssm-agent로 해결할 수 있습니다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ryurock/items/fa18b25b1b38c9a0f113텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)