공부하기싫어
article thumbnail

안쓰는 노트북을 EC2에서 실행중인 k3s cluster의 worker node로 추가해보려고했지만 실패했다..

그러던 중 AWS에 ECS Anywhere라는, 온프레미스 환경을 ECS 클러스터로 사용할 수 있도록 관리해주는 서비스를 알게되서 시도해보려고 한다.

 

chatgpt 4o 를 사용해서 공식문서를 번역해가며 작성한 글입니다.

 

1. 개요

1.1 소개

Amazon ECS Anywhere는 온프레미스 서버 또는 가상 머신(VM)과 같은 외부 인스턴스를 Amazon ECS 클러스터에 등록할 수 있는 지원을 제공합니다. 외부 인스턴스는 아웃바운드 트래픽을 생성하거나 데이터를 처리하는 애플리케이션을 실행하는 데 최적화되어 있습니다. 애플리케이션이 인바운드 트래픽을 필요로 하는 경우 Elastic Load Balancing 지원의 부재로 인해 이러한 워크로드 실행이 덜 효율적일 수 있습니다. Amazon ECS는 새로운 EXTERNAL 런치 타입을 추가하여 외부 인스턴스에서 서비스를 생성하거나 작업을 실행할 수 있도록 했습니다.

다음은 Amazon ECS Anywhere의 고수준 시스템 아키텍처 개요를 제공합니다. 온프레미스 서버에는 Amazon ECS 에이전트와 SSM 에이전트가 모두 설치되어 있습니다.

 

 

1.2 고려사항

외부 인스턴스를 사용하기 전에 다음 사항들을 고려해야 합니다.

  • 한 번에 하나의 클러스터에 외부 인스턴스를 등록할 수 있습니다. 다른 클러스터에 외부 인스턴스를 등록하는 방법에 대해서는 Amazon ECS 외부 인스턴스 등록 해제 문서를 참조하세요.
  • 외부 인스턴스는 AWS API와 통신할 수 있는 IAM 역할이 필요합니다. 자세한 내용은 Amazon ECS Anywhere IAM 역할을 참조하세요.
  • 외부 인스턴스에는 사전에 구성된 인스턴스 자격 증명 체인이 로컬에 정의되어 있지 않아야 합니다. 이는 등록 스크립트와 충돌할 수 있습니다.
  • 컨테이너 로그를 CloudWatch Logs로 전송하려면 작업 정의에서 작업 실행 IAM 역할을 생성하고 지정해야 합니다.
  • 외부 인스턴스가 클러스터에 등록되면, ecs.capability.external 속성이 인스턴스와 연결됩니다. 이 속성은 인스턴스를 외부 인스턴스로 식별합니다. 작업 배치 제약 조건으로 사용할 사용자 정의 속성을 외부 인스턴스에 추가할 수 있습니다. 자세한 내용은 사용자 정의 속성을 참조하세요.
  • 외부 인스턴스에 리소스 태그를 추가할 수 있습니다. 자세한 내용은 외부 컨테이너 인스턴스를 참조하세요.
  • ECS Exec은 외부 인스턴스에서 지원됩니다. 자세한 내용은 ECS Exec을 사용한 Amazon ECS 컨테이너 모니터링을 참조하세요.
  • 다음은 외부 인스턴스와의 네트워킹에 관한 추가 고려 사항입니다. 자세한 내용은 네트워킹을 참조하세요.
더보기
  • 서비스 로드 밸런싱은 지원되지 않습니다.
  • 서비스 검색은 지원되지 않습니다.
  • 외부 인스턴스에서 실행되는 작업은 bridge, host, 또는 none 네트워크 모드를 사용해야 합니다. awsvpc 네트워크 모드는 지원되지 않습니다.
  • 각 AWS 리전에는 Amazon ECS 서비스 도메인이 있습니다. 이 서비스 도메인은 외부 인스턴스로 트래픽을 전송할 수 있도록 허용되어야 합니다.
  • 외부 인스턴스에 설치된 SSM 에이전트는 하드웨어 지문을 사용하여 30분마다 IAM 자격 증명을 갱신합니다. 외부 인스턴스가 AWS와의 연결이 끊어진 경우, SSM 에이전트는 연결이 재설정된 후 자동으로 자격 증명을 새로 고칩니다. 자세한 내용은 AWS Systems Manager 사용자 가이드에서 하드웨어 지문을 사용한 온프레미스 서버 및 가상 머신 검증을 참조하세요.
  • UpdateContainerAgent API는 지원되지 않습니다. 외부 인스턴스에서 SSM 에이전트나 Amazon ECS 에이전트를 업데이트하는 방법에 대해서는 AWS Systems Manager 에이전트 및 외부 인스턴스에서 Amazon ECS 컨테이너 에이전트 업데이트를 참조하세요.
  • Amazon ECS 용량 제공자는 지원되지 않습니다. 외부 인스턴스에서 서비스를 생성하거나 독립 실행형 작업을 실행하려면 EXTERNAL 런치 타입을 사용하세요.
  • SELinux는 지원되지 않습니다.
  • Amazon EFS 볼륨을 사용하거나 EFSVolumeConfiguration을 지정하는 것은 지원되지 않습니다.
  • App Mesh와의 통합은 지원되지 않습니다.
  • 콘솔을 사용하여 외부 인스턴스 작업 정의를 생성하는 경우, 콘솔 JSON 편집기를 사용하여 작업 정의를 생성해야 합니다.
  • Windows에서 ECS Anywhere를 실행할 때는 온프레미스 인프라에서 자체 Windows 라이선스를 사용해야 합니다.
  • Amazon ECS 최적화 AMI를 사용하지 않는 경우, 다음 명령어를 외부 컨테이너 인스턴스에서 실행하여 작업에 IAM 역할을 사용하는 규칙을 구성해야 합니다. 자세한 내용은 외부 인스턴스 추가 구성을 참조하세요.
$ sysctl -w net.ipv4.conf.all.route_localnet=1
$ iptables -t nat -A PREROUTING -p tcp -d 169.254.170.2 --dport 80 -j DNAT --to-destination 127.0.0.1:51679
$ iptables -t nat -A OUTPUT -d 169.254.170.2 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 51679

 

 

 

2. 요금

https://aws.amazon.com/ko/ecs/anywhere/pricing/

Amazon ECS Anywhere의 경우 최소 요금이나 사전 약정은 없습니다. ECS Anywhere 에서 관리하는 인스턴스 실행에 대한 비용만 지불하면 됩니다.

2.1 요금 수치

관리하는 각 ECS Anywhere 온프레미스 인스턴스에 대해 시간당 0.01025 USD의 요금을 지불합니다. 온프레미스 인스턴스는 Amazon ECS 클러스터에 등록되고 Amazon ECS 컨테이너 에이전트를 실행하는 고객 관리형 인스턴스입니다.

Amazon ECS 클러스터에 등록된 인스턴스가 ECS 제어 플레인에 등록된 시간(가장 가까운 초 단위로 반올림됨)에 따라 비용이 청구됩니다. 온프레미스 인스턴스가 등록 해제된 시간, 종료된 시간 또는 중단된 시간에 대해서는 비용이 청구되지 않습니다. 이 요금은 온프레미스 인스턴스에만 적용됩니다.

2.2 요금 내역

요금은 인스턴스를 ECS Anywhere에 등록한 시점부터 인스턴스가 등록 해제된 시점까지 ECS Anywhere가 온프레미스 인스턴스를 관리하는 시간에 따라 계산됩니다. 인스턴스당 최소 1분의 요금이 적용됩니다.

2.2.1 추가 요금

Amazon ECS Anywhere에서는 AWS Systems Manager 에이전트(SSM 에이전트)가 온프레미스 인스턴스를 인증하고 등록해야 합니다. 언제라도 리전별로 계정당 인스턴스가 1,000개를 초과하면 AWS Systems Manager에 온프레미스 인스턴스를 등록할 때 비용이 청구될 수 있습니다. 자세한 내용은 AWS Systems Manager 요금 페이지를 참조하세요.

VPN 또는 Direct Connect를 통해 수행되는 ECS Anywhere 제어 플레인 및 ECS 에이전트 간 통신에 대한 AWS 표준 데이터 전송 요금에 따라 데이터 전송에 대해서 요금이 청구됩니다. 개방형 인터넷을 통해 Amazon ECS Anywhere 제어 플레인 및 ECS 에이전트 간 통신이 수행되는 경우 해당 데이터 전송에 대한 요금은 청구되지 않습니다.

2.2.2 프리 티어

Amazon ECS Anywhere 프리 티어는 모든 리전에서 계정당 6개월 동안 매월 2,200시간의 인스턴스 시간을 포함합니다.

2.3 요금 계산

24시간 한달 내내 돌린다고 가정할 때,

ECS Anywhere의 총 요금 = 1개의 온프레미스 인스턴스 x 30일 x 24시간 x 0.01025 USD의 인스턴스 시간 = 7.38 USD

 

3. 사전작업

3.1 Amazon ECS Anywhere IAM Role

온프레미스 서버 또는 가상 머신(VM)을 클러스터에 등록할 때, 해당 서버나 VM이 AWS API와 통신하기 위해서는 IAM 역할이 필요합니다. 이 IAM 역할은 각 AWS 계정에 대해 한 번만 생성하면 됩니다. 그러나 이 IAM 역할은 클러스터에 등록하는 각 서버나 VM에 연결되어야 합니다. 이 역할은 ECSAnywhereRole입니다. 이 역할은 수동으로 생성할 수 있습니다. 또는 AWS Management Console에서 외부 인스턴스를 등록할 때 Amazon ECS가 대신 역할을 생성할 수 있습니다. IAM 콘솔 검색을 사용하여 ecsAnywhereRole을 검색하여 계정에 이 역할이 이미 있는지 확인할 수 있습니다. 자세한 내용은 IAM 사용자 가이드의 IAM 콘솔 검색을 참조하십시오.

AWS는 ECS Anywhere IAM 역할을 생성할 때 사용할 수 있는 두 가지 관리형 IAM 정책을 제공합니다: AmazonSSMManagedInstanceCore와 AmazonEC2ContainerServiceforEC2Role 정책입니다. AmazonEC2ContainerServiceforEC2Role 정책은 필요 이상의 액세스 권한을 제공할 가능성이 있습니다. 따라서 특정 사용 사례에 따라 이 정책에서 필요한 권한만 추가한 사용자 지정 정책을 생성하는 것이 좋습니다. 자세한 내용은 Amazon ECS 컨테이너 인스턴스 IAM 역할을 참조하십시오.

작업 실행 IAM 역할은 Amazon ECS 컨테이너 에이전트가 대신 AWS API 호출을 할 수 있도록 권한을 부여합니다. 작업 실행 IAM 역할이 사용될 때는 작업 정의에 지정해야 합니다. 자세한 내용은 Amazon ECS 작업 실행 IAM 역할을 참조하십시오.

다음 조건 중 하나라도 해당되는 경우 작업 실행 역할이 필요합니다:

  • awslogs 로그 드라이버를 사용하여 컨테이너 로그를 CloudWatch Logs로 전송하는 경우.
  • 작업 정의에 Amazon ECR 개인 리포지토리에 호스팅된 컨테이너 이미지가 지정된 경우. 그러나 외부 인스턴스와 연결된 ECSAnywhereRole 역할에 Amazon ECR에서 이미지를 가져오는 데 필요한 권한이 포함된 경우 작업 실행 역할에 이를 포함할 필요는 없습니다.

3.2 Creating the Amazon ECS Anywhere role

  1. Create a local file named ssm-trust-policy.json with the following trust policy.
{ "Version": "2012-10-17", 
  "Statement": { 
  	"Effect": "Allow", 
    "Principal": {"Service": [ 
    	"ssm.amazonaws.com" 
    ]}, 
    "Action": "sts:AssumeRole" 
    } 
}

 

 

2. Create the role and attach the trust policy by using the following AWS CLI command.

aws iam create-role --role-name ecsAnywhereRole --assume-role-policy-document file://ssm-trust-policy.json

 

3. Attach the AWS managed policies by using the following command.

aws iam attach-role-policy --role-name ecsAnywhereRole --policy-arn arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore 
aws iam attach-role-policy --role-name ecsAnywhereRole --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role

 

역할을 생성할 때 IAM 사용자 지정 신뢰 정책 워크플로우를 사용할 수도 있습니다. 자세한 내용은 IAM 사용자 가이드의 사용자 지정 신뢰 정책을 사용하여 역할 생성(콘솔) 섹션을 참조하시오.

 

4. ECS Anywhere External Instance

새로운 클러스터를 만들고 외부 인스턴스로 내 노트북을 추가할 것이다.

 

Amazon ECS 콘솔을 사용하여 Amazon ECS 클러스터를 생성할 수 있습니다. 시작하기 전에, Amazon ECS 사용 설정 단계를 완료하고 적절한 IAM 권한을 할당했는지 확인하세요. 자세한 내용은 Amazon ECS 클러스터 예제를 참조하세요. Amazon ECS 콘솔은 AWS CloudFormation 스택을 생성하여 Amazon ECS 클러스터에 필요한 리소스를 간단하게 생성할 수 있는 방법을 제공합니다.

 

4.1 새 클러스터 생성 (Amazon ECS 콘솔 사용)

  1. 콘솔을 열려면 https://console.aws.amazon.com/ecs/v2 에 접속하세요.
  2. 탐색 바에서 사용할 리전을 선택합니다.
  3. 탐색 창에서 클러스터를 선택합니다.
  4. 클러스터 페이지에서 클러스터 생성을 선택합니다.
  5. 클러스터 구성에서 다음을 구성합니다:
    1. 클러스터 이름에 고유한 이름을 입력합니다. 이름은 최대 255자의 대소문자, 숫자 및 하이픈을 포함할 수 있습니다.
    2. (선택 사항) Service Connect에 사용할 네임스페이스가 클러스터 이름과 다르게 하려면 네임스페이스에 고유한 이름을 입력합니다.
  6. 인프라 확장에서 AWS Fargate (서버리스)를 선택합니다.
  7. (선택 사항) 모니터링 확장에서 컨테이너 인사이트 사용을 활성화하려면 Container Insights 사용을 켭니다.
  8. (선택 사항) 태그 확장에서 태그를 구성하여 클러스터를 식별하는 데 도움이 되도록 합니다.
    • 키에 키 이름을 입력합니다.
    • 값에 키 값을 입력합니다.
  9. [태그 추가] 태그 추가를 선택하고 다음을 수행합니다:
  10. 생성을 선택합니다.

 

4.2 Amazon ECS 클러스터에 외부 인스턴스 등록하기

https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-anywhere-registration.html

Amazon ECS 클러스터에 등록하는 각 외부 인스턴스에는 SSM Agent, Amazon ECS 컨테이너 에이전트, 그리고 Docker가 설치되어 있어야 합니다. 외부 인스턴스를 Amazon ECS 클러스터에 등록하려면 먼저 AWS Systems Manager 관리 인스턴스로 등록되어야 합니다. Amazon ECS 콘솔에서 몇 번의 클릭으로 설치 스크립트를 생성할 수 있습니다. 설치 스크립트에는 Systems Manager 활성화 키와 각 필요한 에이전트 및 Docker를 설치하는 명령어가 포함되어 있습니다. 설치 스크립트는 온프레미스 서버나 VM에서 실행하여 설치 및 등록 단계를 완료해야 합니다.

 

Note

Linux 외부 인스턴스를 클러스터에 등록하기 전에, 외부 인스턴스에 /etc/ecs/ecs.config 파일을 생성하고 원하는 컨테이너 에이전트 구성 매개변수를 추가해야 합니다. 클러스터에 외부 인스턴스를 등록한 후에는 이 작업을 수행할 수 없습니다. 자세한 내용은 Amazon ECS 컨테이너 에이전트 구성을 참조하십시오.

 

4.2.1 Systems Manager activation pair 생성

이는 Systems Manager 관리 인스턴스 활성화에 사용됩니다. 출력에는 ActivationId와 ActivationCode가 포함됩니다. 이 값들은 이후 단계에서 사용됩니다. 생성한 ECS Anywhere IAM 역할을 반드시 지정해야 합니다. 자세한 내용은 Amazon ECS Anywhere IAM 역할을 참조하세요.

aws ssm create-activation --iam-role ecsAnywhereRole | tee ssm-activation.json

 

Systems Manager 활성화 코드는 생성 후 일정 기간 동안만 유효합니다.

 

4.2.2 온프레미스 혹은 VM에서 설치 스크립트 다운로드

curl --proto "https" -o "/tmp/ecs-anywhere-install.sh" "https://amazon-ecs-agent.s3.amazonaws.com/ecs-anywhere-install-latest.sh"

 

4.2.3 (Optional) 설치 스크립트 검증

  • 운영체제에 맞게 gpg 설치
sudo apt-get -y install gpg

 

gpg --keyserver hkp://keys.gnupg.net:80 --recv BCE9D9A42D51784F

 

  • Download the installation script signature 
    • 서명은 .asc 확장자를 가진 파일에 저장된 ASCII 분리 PGP 서명입니다.
  • curl --proto "https" -o "/tmp/ecs-anywhere-install.sh.asc" "<https://amazon-ecs-agent.s3.amazonaws.com/ecs-anywhere-install-latest.sh.asc>"
  • Verify the installation script file using the key.
gpg --verify /tmp/ecs-anywhere-install.sh.asc /tmp/ecs-anywhere-install.sh

 

 

위 명령을 실행했을때의 기대 결과

gpg: Signature made Tue 25 May 2021 07:16:29 PM UTC
gpg:                using RSA key 50DECCC4710E61AF
gpg: Good signature from "Amazon ECS <ecs-security@amazon.com>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: F34C 3DDA E729 26B0 79BE  AEC6 BCE9 D9A4 2D51 784F
     Subkey fingerprint: D64B B6F9 0CF3 77E9 B5FB  346F 50DE CCC4 710E 61AF

 

4.2.4 설치 스크립트 실행

온프레미스 서버 또는 가상 머신(VM)에서 설치 스크립트를 실행합니다. 클러스터 이름, 리전, 첫 번째 단계에서 얻은 Systems Manager 활성화 ID와 활성화 코드를 지정합니다.

sudo bash /tmp/ecs-anywhere-install.sh \
    --region $REGION \
    --cluster $CLUSTER_NAME \
    --activation-id $ACTIVATION_ID \
    --activation-code $ACTIVATION_CODE

 

 

5. 결과

성공~

 

 

 

참고

Amazon ECS clusters for the external launch type - Amazon Elastic Container Service

Amazon ECS Anywhere 요금 – Amazon Web Services