AWS ECS에 10분간 Docker compose 스택을 배포합니다. Hasura와 Postgres의 경우⏰
40097 단어 cloudskillsdevopsawsdocker
소개하다.
ecs-cli
명령은 작은 보석💎👉
ecs-cli
파일 형식 버전 1, 2, 3과 같은 구문을 사용하여 AWS ECS에 Docker 스택을 쉽게 배치할 수 있습니다.👉
ecs-cli
의 장점은 파일 재사용docker-compose.yml
이고 컨테이너를 AWS에 배치하는 것입니다.👉
ecs-cli
docker-compose-yml
를 ECS 작업 정의 및 서비스로 변환이 문서에서는 다음을 다룹니다.
ecs-cli
를 사용하여 AWS ECS 클러스터를 작성하여 Docker 컨테이너 세트예를 들어, 다음 섹션으로 구성된 Docker 스택을 배치합니다.
AWS EFS: 즉각적인 GraphQL 및 Rest API
카술라 대상 아키텍처
Docker stack
이 Docker 스택은
AWS ECS Cluster
에 배치됩니다.7보
ecs-cli
ecs-cli
Docker Compose Stack
AWS ECS
에 docker compose 창고 배치AWS EFS
AWS EFS
추가양조 1단계:ecs cli 설치
첫 번째 단계는 시스템에
ecs-cli
명령을 설치하는 것입니다.macOS, Linux, Windows의 전체 설치 과정은 이것 을 통해 얻을 수 있습니다.
macOS의 경우 설치 프로그램은 다음과 같습니다.
👉 다운로드
ecs-cli
바이너리 파일sudo curl -Lo /usr/local/bin/ecs-cli https://amazon-ecs-cli.s3.amazonaws.com/ecs-cli-darwin-amd64-latest
👉 설치link(OpenPGP 표준 무료 제공)brew install gnupg
👉 ecs-cli
의 공개 키 가져오기 (간단하게 보기 위해 요점의 키를 복사했습니다)https://gist.githubusercontent.com/raphaelmansuy/5aab3c9e6c03e532e9dcf6c97c78b4ff/raw/f39b4df58833f09eb381700a6a854b1adfea482e/ecs-cli-signature-key.key
👉 서명 가져오기gpg --import ./signature.key
👉 실행 가능sudo chmod +x /usr/local/bin/ecs-cli
👉 설정 확인ecs-cli --version
gnupg ecs cli 구성👩🌾
선결 조건
AWS 액세스 키 ID를 만들려면 다음을 읽으십시오link.
환경 변수는 올바른 AWS ACCESS KEY ID/AWS SECRET ACCESS KEY 쌍을 구성해야 합니다.
export AWS_ACCESS_KEY_ID="Your Access Key"
export AWS_SECRET_ACCESS_KEY="Your Secret Access Key"
export AWS_DEFAULT_REGION=us-west-2
다음 스크립트는 ecs-cli
영역에서 tutorial
라는 클러스터 구성tutorial-cluster
라는 ECS 구성 파일로, 이 클러스터의 기본 시작 유형은 EC2 인스턴스를 기반으로 합니다.us-west-2
#!/bin/bash
set -e
PROFILE_NAME=tutorial
CLUSTER_NAME=tutorial-cluster
REGION=us-west-2
LAUNCH_TYPE=EC2
ecs-cli configure profile --profile-name "$PROFILE_NAME" --access-key "$AWS_ACCESS_KEY_ID" --secret-key "$AWS_SECRET_ACCESS_KEY"
ecs-cli configure --cluster "$CLUSTER_NAME" --default-launch-type "$LAUNCH_TYPE" --region "$REGION" --config-name "$PROFILE_NAME"
문서 2단계: ECS 클러스터 만들기🚀
우리는 ec2 실례를 바탕으로 ECS 집단을 만들 것이다.
ECS는 두 종류의 발사 유형
configure.sh
과 EC2
을 허용한다.👉 이름이
FARGATE
인 키 쌍을 만들려면 다음과 같이 하십시오.aws ec2 create-key-pair --key-name tutorial-cluster \
--query 'KeyMaterial' --output text > ~/.ssh/tutorial-cluster.pem
👉 2개의ec2 실례를 포함하는 그룹을 만듭니다 tutorial-cluster
.중등이었어tutorial-cluster
#!/bin/bash
KEY_PAIR=tutorial-cluster
ecs-cli up \
--keypair $KEY_PAIR \
--capability-iam \
--size 2 \
--instance-type t3.medium \
--tags project=tutorial-cluster,owner=raphael \
--cluster-config tutorial \
--ecs-profile tutorial
두 개의 태그create-cluster.sh
와 project=tutorial
를 추가하여 명령에서 생성된 리소스를 쉽게 파악할 수 있습니다.👉 결실
INFO[0006] Using recommended Amazon Linux 2 AMI with ECS Agent 1.50.2 and Docker version 19.03.13-ce
INFO[0007] Created cluster cluster=tutorial-cluster region=us-west-2
INFO[0010] Waiting for your cluster resources to be created...
INFO[0010] Cloudformation stack status stackStatus=CREATE_IN_PROGRESS
INFO[0073] Cloudformation stack status stackStatus=CREATE_IN_PROGRESS
INFO[0136] Cloudformation stack status stackStatus=CREATE_IN_PROGRESS
VPC created: vpc-XXXXX
Security Group created: sg-XXXXX
Subnet created: subnet-AAAA
Subnet created: subnet-BBBB
Cluster creation succeeded.
이 명령은 다음을 생성하는 데 사용됩니다.이제 새로 만든 ECS 클러스터에 예제 Docker 응용 프로그램을 배치할 수 있습니다.
👉
owner=raphael
라는 파일을 만듭니다.version: "3"
services:
webdemo:
image: "amazon/amazon-ecs-sample"
ports:
- "80:80"
이 창고는 로컬에서 테스트하는 것이 가장 좋다docker-compose up
결과:최신: 아마존/아마존ecs 예시
요약:sha256:36c7b282abd0186e01419f2e58743e1bf635808231049bbc9d77e59e3a8e4914
상태:amazon/amazon ecs 업데이트 이미지 다운로드 예: 최신
👉 이제 AWS ECS에 이 스택을 배치할 수 있습니다.
ecs-cli compose --project-name tutorial --file docker-compose.yml \
--debug service up \
--deployment-max-percent 100 --deployment-min-healthy-percent 0 \
--region us-west-2 --ecs-profile tutorial --cluster-config tutorial
👉 서비스가 실행 중인지 확인하려면 다음 명령을 사용할 수 있습니다.ecs-cli ps
결과:Name State Ports TaskDefinition Health
tutorial-cluster/2e5af2d48dbc41c1a98/webdemo RUNNING 34.217.107.14:80->80/tcp tutorial:2 UNKNOWNK
IP 주소docker-compose.yml
를 사용하여 스택 배포 및 액세스👉 이제 배포된 웹 사이트를 탐색할 수 있습니다.
open http://34.217.107.14
👉 클러스터의 EC2 인스턴스에 연결하기 위해 포트 22 열기
# Get my IP
myip="$(dig +short myip.opendns.com @resolver1.opendns.com)"
# Get the security group
sg="$(aws ec2 describe-security-groups --filters Name=tag:project,Values=tutorial-cluster | jq '.SecurityGroups[].GroupId')"
# Add port 22 to the Security Group of the VPC
aws ec2 authorize-security-group-ingress \
--group-id $sg \
--protocol tcp \
--port 22 \
--cidr "$myip/32" | jq '.'
👉 인스턴스와의 연결chmod 400 ~/.ssh/tutorial-cluster.pem
ssh -i ~/.ssh/tutorial-cluster.pem [email protected]
👉 원격 서버에 연결하면 실행 중인 컨테이너를 확인할 수 있습니다.docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7deaa49ed72c amazon/amazon-ecs-sample "/usr/sbin/apache2 -…" 2 minutes ago Up 2 minutes 0.0.0.0:80->80/tcp ecs-tutorial-3-webdemo-9cb1a49483a9cfb7b101
cd1d2a9807d4 amazon/amazon-ecs-agent:latest "/agent" 55 minutes ago Up 55 minutes (healthy) ecs-agent
단계 3: 관찰성 추가🤩
실행 중인 인스턴스의 로그를 수집하려면 AWS CloudWatch 로그 그룹을 만들 수 있습니다.
이를 위해
34.217.107.14
파일을 수정할 수 있습니다.version: "2"
services:
webdemo:
image: "amazon/amazon-ecs-sample"
ports:
- "80:80"
logging:
driver: awslogs
options:
awslogs-group: tutorial
awslogs-region: us-west-2
awslogs-stream-prefix: demo
👉 그런 다음 로그 그룹 만들기 옵션을 사용하여 서비스를 재배치합니다.ecs-cli compose --project-name tutorial --file docker-compose.yml \
--debug service up \
--deployment-max-percent 100 --deployment-min-healthy-percent 0 \
--region us-west-2 --ecs-profile tutorial --cluster-config tutorial \
--create-log-groups
👉 저희는 이제 이 서비스를 삭제할 수 있습니다.🗑
ecs-cli compose --project-name tutorial --file docker-compose.yml \
--debug service down \
--region us-west-2 --ecs-profile tutorial --cluster-config tutorial
👉 더 복잡한 스택 배포
현재 배포 준비 및 HASURA
Postgres
docker-compose.yml
version: '3'
services:
postgres:
image: postgres:12
restart: always
volumes:
- db_data:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: postgrespassword
graphql-engine:
image: hasura/graphql-engine:v1.3.3
ports:
- "80:8080"
depends_on:
- "postgres"
restart: always
environment:
HASURA_GRAPHQL_DATABASE_URL: postgres://postgres:postgrespassword@postgres:5432/postgres
## enable the console served by server
HASURA_GRAPHQL_ENABLE_CONSOLE: "true" # set to "false" to disable console
## enable debugging mode. It is recommended to disable this in production
HASURA_GRAPHQL_DEV_MODE: "true"
HASURA_GRAPHQL_ENABLED_LOG_TYPES: startup, http-log, webhook-log, websocket-log, query-log
## uncomment next line to set an admin secret
# HASURA_GRAPHQL_ADMIN_SECRET: myadminsecretkey
volumes:
db_data:
👉 로컬에서 스택을 테스트할 수 있습니다.docker-compose up &
그리고 나서open localhost
👉 이제 AWS ECS에 이 스택을 배포할 수 있습니다.
그 전에 파일을 업데이트해야 합니다
docker-compose.yml
.우리는 반드시 보충해야 한다.
docker-compose.yml
명령logging
명령version: '3'
services:
postgres:
image: postgres:12
restart: always
volumes:
- db_data:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: postgrespassword
logging:
driver: awslogs
options:
awslogs-group: tutorial
awslogs-region: us-west-2
awslogs-stream-prefix: hasura-postgres
graphql-engine:
image: hasura/graphql-engine:v1.3.3
ports:
- "80:8080"
depends_on:
- "postgres"
links:
- postgres
restart: always
environment:
HASURA_GRAPHQL_DATABASE_URL: postgres://postgres:postgrespassword@postgres:5432/postgres
## enable the console served by server
HASURA_GRAPHQL_ENABLE_CONSOLE: "true" # set to "false" to disable console
## enable debugging mode. It is recommended to disable this in production
HASURA_GRAPHQL_DEV_MODE: "true"
HASURA_GRAPHQL_ENABLED_LOG_TYPES: startup, http-log, webhook-log, websocket-log, query-log
## uncomment next line to set an admin secret
# HASURA_GRAPHQL_ADMIN_SECRET: myadminsecretkey
logging:
driver: awslogs
options:
awslogs-group: tutorial
awslogs-region: us-west-2
awslogs-stream-prefix: hasura
volumes:
db_data:
추가 매개변수를 지정하려면 links
라는 파일을 생성해야 합니다.
version: 1
task_definition:
ecs_network_mode: bridge
ecs-params.yml
명령은 이 파일을 사용합니다.👉 그런 다음 스택을 시작할 수 있습니다.
ecs-cli compose --project-name tutorial --file docker-compose.yml \
--debug service up \
--deployment-max-percent 100 --deployment-min-healthy-percent 0 \
--region us-west-2 --ecs-profile tutorial \
--cluster-config tutorial --create-log-groups
결과:DEBU[0000] Parsing the compose yaml...
DEBU[0000] Docker Compose version found: 3
DEBU[0000] Parsing v3 project...
WARN[0000] Skipping unsupported YAML option for service... option name=restart service name=postgres
WARN[0000] Skipping unsupported YAML option for service... option name=depends_on service name=graphql-engine
WARN[0000] Skipping unsupported YAML option for service... option name=restart service name=graphql-engine
DEBU[0000] Parsing the ecs-params yaml...
DEBU[0000] Parsing the ecs-registry-creds yaml...
DEBU[0000] Transforming yaml to task definition...
DEBU[0004] Finding task definition in cache or creating if needed TaskDefinition="{\n ContainerDefinitions: [{\n Command: [],\n Cpu: 0,\n DnsSearchDomains: [],\n DnsServers: [],\n DockerSecurityOptions: [],\n EntryPoint: [],\n Environment: [{\n Name: \"POSTGRES_PASSWORD\",\n Value: \"postgrespassword\"\n }],\n Essential: true,\n ExtraHosts: [],\n Image: \"postgres:12\",\n Links: [],\n LinuxParameters: {\n Capabilities: {\n\n },\n Devices: []\n },\n Memory: 512,\n MountPoints: [{\n ContainerPath: \"/var/lib/postgresql/data\",\n ReadOnly: false,\n SourceVolume: \"db_data\"\n }],\n Name: \"postgres\",\n Privileged: false,\n PseudoTerminal: false,\n ReadonlyRootFilesystem: false\n },{\n Command: [],\n Cpu: 0,\n DnsSearchDomains: [],\n DnsServers: [],\n DockerSecurityOptions: [],\n EntryPoint: [],\n Environment: [\n {\n Name: \"HASURA_GRAPHQL_ENABLED_LOG_TYPES\",\n Value: \"startup, http-log, webhook-log, websocket-log, query-log\"\n },\n {\n Name: \"HASURA_GRAPHQL_DATABASE_URL\",\n Value: \"postgres://postgres:postgrespassword@postgres:5432/postgres\"\n },\n {\n Name: \"HASURA_GRAPHQL_ENABLE_CONSOLE\",\n Value: \"true\"\n },\n {\n Name: \"HASURA_GRAPHQL_DEV_MODE\",\n Value: \"true\"\n }\n ],\n Essential: true,\n ExtraHosts: [],\n Image: \"hasura/graphql-engine:v1.3.3\",\n Links: [],\n LinuxParameters: {\n Capabilities: {\n\n },\n Devices: []\n },\n Memory: 512,\n Name: \"graphql-engine\",\n PortMappings: [{\n ContainerPort: 8080,\n HostPort: 80,\n Protocol: \"tcp\"\n }],\n Privileged: false,\n PseudoTerminal: false,\n ReadonlyRootFilesystem: false\n }],\n Cpu: \"\",\n ExecutionRoleArn: \"\",\n Family: \"tutorial\",\n Memory: \"\",\n NetworkMode: \"\",\n RequiresCompatibilities: [\"EC2\"],\n TaskRoleArn: \"\",\n Volumes: [{\n Name: \"db_data\"\n }]\n}"
DEBU[0005] cache miss taskDef="{\n\n}" taskDefHash=4e57f367846e8f3546dd07eadc605490
INFO[0005] Using ECS task definition TaskDefinition="tutorial:4"
WARN[0005] No log groups to create; no containers use 'awslogs'
INFO[0005] Updated the ECS service with a new task definition. Old containers will be stopped automatically, and replaced with new ones deployment-max-percent=100 deployment-min-healthy-percent=0 desiredCount=1 force-deployment=false service=tutorial
INFO[0006] Service status desiredCount=1 runningCount=1 serviceName=tutorial
INFO[0027] Service status desiredCount=1 runningCount=0 serviceName=tutorial
INFO[0027] (service tutorial) has stopped 1 running tasks: (task ee882a6a66724415a3bdc8fffaa2824c). timestamp="2021-03-08 07:30:33 +0000 UTC"
INFO[0037] (service tutorial) has started 1 tasks: (task a1068efe89614812a3243521c0d30847). timestamp="2021-03-08 07:30:43 +0000 UTC"
INFO[0074] (service tutorial) has started 1 tasks: (task 1949af75ac5a4e749dfedcb89321fd67). timestamp="2021-03-08 07:31:23 +0000 UTC"
INFO[0080] Service status desiredCount=1 runningCount=1 serviceName=tutorial
INFO[0080] ECS Service has reached a stable state desiredCount=1 runningCount=1 serviceName=tutorial
👉 그런 다음 컨테이너가 AWS ECS 클러스터에서 작동하는지 확인할 수 있습니다.ecs-cli ps
결실Name State Ports TaskDefinition Health
tutorial-cluster/00d7ff5191dd4d11a9b52ea64fb9ee26/graphql-engine RUNNING 34.217.107.14:80->8080/tcp tutorial:10 UNKNOWN
tutorial-cluster/00d7ff5191dd4d11a9b52ea64fb9ee26/postgres RUNNING tutorial:10 UNKNOWN
👉 다음:💪open http://34.217.107.14
👉 우리 이제 쌓아올리는 거 멈출 수 있어.
ecs-cli compose down
솔루션에 지속적인 지원을 추가하기 위해 AWS EFS: Elastic File System4단계: 내 그룹에 지구층 추가
👉
ecs-cli
라는 EFS 파일 시스템 생성aws efs create-file-system \
--performance-mode generalPurpose \
--throughput-mode bursting \
--encrypted \
--tags Key=Name,Value=hasura-db-filesystem
결과:{
"OwnerId": "XXXXX",
"CreationToken": "10f91a50-0649-442d-b4ad-2ce67f1546bf",
"FileSystemId": "fs-5574bd52",
"FileSystemArn": "arn:aws:elasticfilesystem:us-west-2:XXXXX:file-system/fs-5574bd52",
"CreationTime": "2021-03-08T16:40:19+08:00",
"LifeCycleState": "creating",
"Name": "hasura-db-filesystem",
"NumberOfMountTargets": 0,
"SizeInBytes": {
"Value": 0,
"ValueInIA": 0,
"ValueInStandard": 0
},
"PerformanceMode": "generalPurpose",
"Encrypted": true,
"KmsKeyId": "arn:aws:kms:us-west-2:XXXXX:key/97542264-cc64-42f9-954e-4af2b17f72aa",
"ThroughputMode": "bursting",
"Tags": [
{
"Key": "Name",
"Value": "hasura-db-filesystem"
}
]
}
👉 VPC의 각 서브넷에 마운트 지점을 추가하려면:aws ec2 describe-subnets --filters Name=tag:project,Values=tutorial-cluster \
| jq ".Subnets[].SubnetId" | \
xargs -ISUBNET aws efs create-mount-target \
--file-system-id fs-5574bd52 --subnet-id SUBNET
다음 단계에서는 VPC에서 NFS 연결 허용우리는 우선 모든 적재 목표와 관련된 안전 그룹을 확보해야 한다
efs_sg=$(aws efs describe-mount-targets --file-system-id fs-5574bd52 \
| jq ".MountTargets[0].MountTargetId" \
| xargs -IMOUNTG aws efs describe-mount-target-security-groups \
--mount-target-id MOUNTG | jq ".SecurityGroups[0]" | xargs echo )
👉 그리고 VPC의 보안 그룹을 위해 TCP 포트 2049를 열어야 합니다.vpc_sg="$(aws ec2 describe-security-groups \
--filters Name=tag:project,Values=tutorial-cluster \
| jq '.SecurityGroups[].GroupId' | xargs echo)"
👉 그리고 VPC의 기본 보안 그룹에서 TCP/2049 포트를 승인해야 합니다.aws ec2 authorize-security-group-ingress \
--group-id $efs_sg \
--protocol tcp \
--port 2049 \
--source-group $vpc_sg \
--region us-west-2
👉 이제 영구 지원을 추가하기 위해 수정hasura-db-file-system
할 수 있습니다.ecs-params.yml
version: 1
task_definition:
ecs_network_mode: bridge
efs_volumes:
- name: db_data
filesystem_id: fs-5574bd52
transit_encryption: ENABLED
👉 그런 다음 스택을 재배치할 수 있습니다.ecs-cli compose --project-name tutorial --file docker-compose.yml \
--debug service up \
--deployment-max-percent 100 --deployment-min-healthy-percent 0 \
--region us-west-2 --ecs-profile tutorial \
--cluster-config tutorial --create-log-groups
👉 Et voilá: 스택이 실행 중입니다.🎉 🦄 💪요약
💪 ECS-CLI 클러스터를 배포하고 docker compose 스택을 시작했습니다.
🚀 다음 단계에서는 AWS 어플리케이션 로드 밸런서를 사용하여 스택을 공개하고 보호합니다.
본문과 관련된 스크립트는
👉
Reference
이 문제에 관하여(AWS ECS에 10분간 Docker compose 스택을 배포합니다. Hasura와 Postgres의 경우⏰), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/raphaelmansuy/10-minutes-to-deploy-a-docker-compose-stack-on-aws-illustrated-with-hasura-and-postgres-3f6e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)