미래 지향적인 웹 앱 구축: The Codest의 전문가 팀이 제공하는 인사이트
The Codest가 최첨단 기술로 확장 가능한 대화형 웹 애플리케이션을 제작하고 모든 플랫폼에서 원활한 사용자 경험을 제공하는 데 탁월한 성능을 발휘하는 방법을 알아보세요. Adobe의 전문성이 어떻게 디지털 혁신과 비즈니스를 촉진하는지 알아보세요...
이 튜토리얼에서는 Amazon Elastic 컨테이너 서비스(ECS)를 사용하여 샘플 Rails 앱을 배포하는 방법을 보여드리고자 합니다.
다음을 실행하여 생성해 보겠습니다. 레일즈 새 샘플 레일즈 앱
를 클릭한 다음 기본 컨트롤러 동작을 생성합니다. 레일즈 G 컨트롤러 환영 색인
루트 경로에 대한 경로를 '루트 대상: welcome#index'로 설정합니다.
우리의 목표는 이 환영 페이지가 ECS를 사용하여 배포되는 것을 보는 것입니다.
Amazon ECR 는 컨테이너 레지스트리입니다. 이를 사용하여 앱의 이미지를 저장하고 ECS에서 실행할 수 있도록 이미지를 가져올 것입니다.
귀하의 AWS 패널를 검색하여 Elastic 컨테이너
레지스트리 을 클릭하고 시작하기. 아래 화면이 표시됩니다:
비공개 리포지토리를 만들고 이름을 지정합니다. sample-rails-app.
리포지토리가 있지만 비어 있습니다. 앱의 이미지가 저장소에 포함되기를 원합니다. 이것이 다음 단계입니다.
# Gemfile.lock 이후 Gemfile이 수정된 경우 오류 발생
RUN 번들 구성 --global frozen 1
WORKDIR /app
COPY Gemfile Gemfile.lock ./
RUN 번들 설치
COPY .
CMD ["rails", "server", "-b", "0.0.0.0"]
그런 다음 이미지를 빌드하고 ECR 리포지토리에 푸시해야 합니다.
그 전에 `rails assets:precom파일`로 에셋을 미리 컴파일해 보겠습니다.
이제 생성된 리포지토리로 이동합니다. 화면 상단에 다음과 같이 푸시 명령 보기 버튼을 눌러 자세한 방법을 확인하세요.
제 경우(Linux)는 다음 AWS 지침에 따라 실행합니다:
aws ecr get-login-password --region eu-central-1 | docker login --username AWS --password-stdin 212516879399.dkr.ecr.eu-central-1.amazonaws.com
도커 빌드 -t 샘플-레일-앱 .
도커 태그 샘플-레일즈-앱:최신 212516879399.dkr.ecr.eu-central-1.amazonaws.com/sample-rails-app:최신
도커 푸시 212516879399.dkr.ecr.eu-central-1.amazonaws.com/sample-rails-app:최신
사용자에게 이 작업을 수행할 수 있는 권한이 있는지 확인하세요. 사용자에게 다음과 같이 AmazonElasticContainerRegistryPowerUser 정책을 추가했습니다:
{
"버전": "2012-10-17",
"성명서": [
{
"Sid": "VisualEditor0",
"Effect": "허용",
"Action": [
"ecr:GetRegistryPolicy",
"ecr:DescribeRegistry",
"ecr:GetAuthorizationToken",
"ecr:삭제 레지스트리 정책",
"ecr:PutRegistryPolicy",
"ecr:PutReplicationConfiguration"
],
"리소스": "*"
},
{
"Sid": "VisualEditor1",
"Effect": "허용",
"Action": "ecr:*",
"리소스": "arn:aws:ecr:*:212516879399:repository/*"
}
]
}
도커 이미지가 준비되었습니다.
외부 세계는 애플리케이션 로드 밸런서에만 연결할 수 있기를 원합니다. ECS 클러스터 내부에서 실행 중인 컨테이너로 트래픽을 전달합니다.
다음으로 이동 EC2 서비스 -> 로드 밸런싱 -> 로드 밸런서를 클릭하고 로드 밸런서 생성를 선택하고 애플리케이션 로드 밸런서 을 클릭하고 만들기 버튼을 클릭합니다.
이름을 다음과 같이 설정합니다. 샘플-레일-앱-알브를 클릭하고 기본 VPC를 사용하고 모든 서브넷을 선택합니다.
남은 것은 다음과 같습니다. 보안 그룹 그리고 리스너 및 라우팅 섹션으로 이동합니다.
로드 밸런서를 위한 새 보안 그룹을 생성합니다. 이 그룹은 방화벽처럼 작동하며 인바운드 및 아웃바운드 트래픽에 대한 규칙을 설정합니다. 인바운드 http 트래픽(TCP 포트 80)은 허용하고 모든 아웃바운드 트래픽은 허용하려고 합니다.
이렇게 하려면 "새 보안 그룹 만들기" 링크를 클릭합니다.
섹션에서 "기본 세부 정보"를 입력하고 이름과 설명을 설정한 후 기본 VPC를 그대로 둡니다.
제 경우 - 이름: "샘플 레일 앱-앱-알브-에스지", 설명: "외부에서 HTTP, 내부에서 모두"
유형으로 인바운드 규칙을 추가합니다: HTTP 및 소스: 어디서나-IPv4. 아웃바운드 규칙은 그대로 둡니다.
클릭 보안 그룹 만들기을 클릭한 다음 애플리케이션 로드 밸런서를 만들던 탭으로 돌아가 보안 그룹을 새로 고치고 방금 만든 보안 그룹을 추가하고 기본 보안 그룹을 제거합니다.
이 섹션에서는 로드 밸런서가 트래픽을 전달할 위치를 정의합니다. Leave 리스너 프로토콜 그리고 포트 를 HTTP와 80으로 설정하고 "대상 그룹 만들기" 링크를 클릭합니다.
이름을 "샘플-레일-앱-alb-tg". 유일한 변경 사항은 포트 번호입니다. 이 포트는 Rails 앱용 포트이므로 3000번 포트로 전달하겠습니다. 다음 단계는 무시합니다(등록된 대상) 을 클릭하고 대상 그룹을 만듭니다.
이제 애플리케이션 로드 밸런서를 생성하던 탭으로 돌아가서 대상 그룹을 새로 고치고 방금 생성한 그룹을 선택합니다.
애플리케이션 로드 밸런서가 준비되었으니 이제 ECS를 사용해 보겠습니다.
클러스터, 작업, 작업 정의, 서비스 등 어려운 용어가 많이 나옵니다. 더 간단하게 설명하기 위해 클러스터를 서버 그룹(EC2 인스턴스)으로 생각하면 됩니다. 각 인스턴스에서는 함께 실행되는 컨테이너 그룹인 작업을 실행합니다. 작업 정의는 특정 그룹에 있는 컨테이너와 해당 컨테이너에 제공하려는 리소스(메모리, CPU)를 설명합니다. 서비스는 이러한 작업을 주시하여 클러스터에서 항상 올바른 수의 정상적인 작업이 실행되고 있는지 확인합니다.
이를 염두에 두고 클러스터를 생성해 보겠습니다.
ECS 페이지로 이동하여 클러스터 링크 및 클러스터 만들기 버튼을 클릭합니다. "EC2 + Linux 네트워킹"를 하나 클릭하고 다음 단계.
클러스터 이름을 "샘플-레일-앱-클러스터". EC2 인스턴스 유형을 선택합니다. 저는 무료 티어 요금제에서 사용할 수 있는 t2-micro를 선택했습니다. 인스턴스 수는 1로 그대로 둡니다.
네트워킹 섹션에서 기본 VPC를 사용하고 모든 서브넷을 선택합니다. 생성을 클릭하고 잠시 기다리면 새로운 ECS 클러스터가 생성됩니다.
를 클릭하고 작업 정의 링크를 클릭한 다음 새 작업 정의 만들기 버튼을 클릭합니다. 버튼을 선택합니다. EC2 옵션을 클릭하고 다음 단계. 실행할 앱은 매우 간단하므로 여기에는 몇 가지 옵션만 필요합니다.
설정 작업 정의 이름을 "샘플 레일 앱"를 클릭한 다음 바로 컨테이너 정의 섹션을 클릭하고 "컨테이너 추가". 컨테이너 이름을 "샘플 레일 앱"를 입력하고 이미지 위치를 "리포지토리 URL/이미지:태그". 새 브라우저 탭에서 ECR로 이동하여 이미지 URI를 복사합니다. 제 경우에는 그랬어요: "212516879399.dkr.ecr.eu-central-1.amazonaws.com/sample-rails-app:latest".
메모리 제한을 권장되는 300-500MiB로 설정합니다. 이제 가장 까다로운 부분인 포트 매핑입니다.
우리 앱은 포트 3000의 컨테이너 내부에서 실행됩니다. 따라서 컨테이너 포트로 3000을 입력합니다. 호스트 포트로 0을 입력하면 기본적으로 임의의 포트를 선택한다는 뜻입니다. 다행히도 애플리케이션 로드 밸런서는 이 포트 매핑을 인식하고 트래픽을 올바르게 전송할 수 있습니다. 이 단일 인스턴스에서 여러 작업을 실행할 수도 있습니다.
환경 변수 추가 RAILS_ENV 로 설정하고 프로덕션.
이제 추가 를 클릭하여 컨테이너 정의를 추가하고 만들기 를 클릭하여 작업 정의 설정을 완료합니다.
클러스터, 로드 밸런서 및 작업 정의가 있습니다. 이제 어떻게든 클러스터 내에서 이러한 작업을 실행해야 합니다. 이것이 바로 서비스의 역할입니다. 새로 생성된 클러스터로 이동하여 서비스 탭을 클릭하고 만들기 버튼을 클릭합니다.
실행 유형을 EC2로 설정하고 이름 추가 "샘플-레일-앱-서비스". 작업 수를 1로 설정하고 다음 단계. 이 페이지에서 애플리케이션 로드 밸런서 라디오 버튼을 선택하고 해당 애플리케이션에 대한 기존 IAM 역할을 선택합니다. "로드 밸런싱할 컨테이너" 섹션에서 이미 올바른 컨테이너 "sample-rails-app:0:3000"을 입력했어야 하며, "로드 밸런서에 추가"를 클릭합니다.
"프로덕션 리스너 포트"는 80:HTTP를 선택하고, 대상 그룹 이름은 이전에 만든 이름인 ""을 사용합니다.샘플-레일-앱-alb-tg"를 클릭하고 다음 단계. Leave 자동 스케일링 옵션을 그대로 클릭하고 다음 단계 그리고 서비스 만들기.
생성된 클러스터 페이지로 이동하여 다음을 확인할 수 있습니다. 작업 탭에 하나의 작업이 실행 중이어야 합니다. 서비스가 시작되었습니다. 이제 EC2 서비스 페이지로 이동하여 로드 밸런서를 클릭하고 애플리케이션 로드 밸런서의 세부 정보를 확인합니다. DNS 이름이 있을 것입니다. 복사하여 브라우저에서 엽니다. 앱으로 이동해야 합니다. 안타깝게도 "504 게이트웨이 시간 초과" 오류가 발생했습니다.
문제는 클러스터의 보안 그룹에 있습니다. 인바운드 규칙이 로드 밸런서에서 들어오는 트래픽을 허용하지 않습니다. 이 문제를 해결하려면 EC2 패널로 돌아가서 보안 그룹 링크를 클릭합니다. 클러스터 생성 프로세스 중에 생성된 새 그룹이 있습니다. 이름이 "EC2Container서비스-샘플-레일-앱-클러스터". 그것을 클릭하고 인바운드 규칙을 편집합니다. VPC의 모든 트래픽을 허용하고 싶으므로 Amazon VPC 패널로 이동하여 VPC IPv4 CIDR이 무엇인지 확인합니다. 규칙 유형을 "모든 트래픽"로 설정하고 소스를 IPv4 CIDR로 설정합니다. 이 규칙을 저장하고 밸런서의 DNS 이름을 로드해 보세요.
여러분도 저처럼 보시길 바랍니다 🙂.
자세히 보기