일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- ec2
- BastianHost
- S3 PrivateLink
- VGW
- mysql 아키텍쳐
- Terraform
- AWS Resolver
- s3 sync
- Route53 Endpoint
- 다이렉트 커넥트
- ix is lock
- x lock s lock
- S3 Gateway Endpoint
- S3 Interface Endpoint
- innodb구조
- S3 private통신
- Route53 Resolver
- 어뎁티브 해시 인덱스
- DXGW
- MySQL
- SessionManager 터널링
- 도커
- 마운트
- sessionManager
- mysql 구조
- s3
- DNS Resolver
- 리눅스
- mysql 엔진
- innodb 버퍼풀
- Today
- Total
이것이 점프 투 공작소
AWS CloudMap 과 Route53 PrivateNameSpace를 이용한 ECS Fargate 디스커버리 구현하기, EC2를 CloudMap에 등록하기 본문
AWS CloudMap 과 Route53 PrivateNameSpace를 이용한 ECS Fargate 디스커버리 구현하기, EC2를 CloudMap에 등록하기
겅겅겅 2023. 5. 14. 10:53
cloudMap에 AWS리소스를 등록하고 만들어진 cloudMap 서비스를
Route53의 private-namespace에 도메인을 등록하여 ECS의 리소스들을 vpc 내에서 디스커버리를 하는법을 정리하려 합니다.
전체적인 흐름은 다음과 같습니다.
1. private-dns-namespace과 CloudMap 생성 -> 2.CloudMap 서비스 생성
3. CloudMap서비스에 Fargate 서비스 등록 -> 4. 동일 vpc내 bastian-host에서 디스커버리 dns 조회
1. pirvate dns namespace 생성
aws servicediscovery create-private-dns-namespace \
--name '생성될 네임스페이스이름' \
--vpc '네임스페이스를 생성할 vpc-id'
먼저 private-dns-namespace를 생성합니다.
생성이 완료되면 operation-id를 반환받게됩니다.
추가로 너무 namespace 이름으로 -을 사용하니 route53에서 네임스페이스를 잘 못찾았습니다.
제대로 했는데도 안되는거같으시면 namespace 이름에 -을 빼보시면 좋을거같습니다..
생성된 private-dns-namespace 조회
아래 명령어를 사용하여 해당 operation-id를 조회하면 생성된 private-dns-namespace의 정보를 확인 할 수 있습니다.
아니면 AWS 웹에 접속해서 만들어진 private-dns-namespace의 정보를 확인 할 수 있습니다.
aws servicediscovery get-operation \
--operation-id '생성된 private-dns-namespace의 operation-id'
만들어진 namespace의 정보를 웹에서도 확인 할 수 있습니다.
route53 영역에도 cloudMap을 통해 생성된 private-dns-namespace를 확인할 수 있습니다.
2. route53의 pirvate-dns-namespace 과 연동되는 cloudMap 서비스 생성하기
아래 명령어를 통해 private-dns-namespace와 연동되는 cloudMap서비스를 생성합니다.
aws servicediscovery create-service \
--name '생성될 cloudMap 서비스 명' \
--namespace-id '생성한 pirvate-dns-namespace-id' \
--dns-config "NamespaceId='생성한 pirvate-dns-namespace-id',DnsRecords=[{Type=A,TTL=60}]" \
-—health-check-custom-config FailureThreshold=1
위 명령어에서는 지정하지 않았지만 디스커버리 시 사용할 RoutingPolicy또한 지정 할 수 있습니다.
지정하지 않을 경우 기본값인 Multivalue라우팅이 지정됩니다.
아래 2가지 라우팅을 지정 가능합니다.
- 가중치 기반 라우팅 (Weighted) : 어떤 인스턴스로 더 많은 라우팅이 될지 지정 할 수 있는 정책입니다. CNAME에서 사용됩니다.
- 멀티값 라우팅 (Multivalue) : RoutingPolicy를 지정하기 않으면 사용되는 기본값입니다. 건강한 인스턴스에 대해 랜덤으로 라우팅합니다. A레코드와 AAAA레코드에 사용 가능합니다.
-- dns-config 명령어는 Amazon Route 53 레코드에 대한 값들을 지정합니다.
명령어를 통해 지정 가능한 DnsRecords들은 다음과 같습니다.
- A: 만들어질 도메인 주소를 IPv4 와 매핑합니다.
- AAAA: 만들어질 도메인 주소를 IPv6 와 매핑합니다.
- CNAME: 만들어질 도메인 주소를 다른 도메인과 매핑합니다
- TXT: 만들어질 도메인 주소를 텍스트 문자열과 매핑합니다.
- SRV: 만들어질 도메인 주소를 특정 서비스와 포트 번호에 매핑, public-namespace에서는 사용 할 수 없습니다.
생성된 cloudMap 서비스 조회
명령어의 리턴값으로 생성된 cloudMap서비스에 대한 정보를 받을 수 있습니다.
저는 user라는 cloudMap 서비스를 만들었습니다.
AWS 웹에서도 확인 할 수 있습니다.
3. 만들어진 cloudMap Service에 리소스 등록하기
3-1 ECS클러스터 생성
생성 시 앞서 만들어 두었던 private-dns-namespace를 지정합니다.
3-2 ECS에서 Service에서 사용할 task-definition 을 생성합니다.
간단한 nginx 이미지로 task를 미리 만들어두었습니다.
3-3 Fargate Service 실행
아래 명령어로 ECS 서비스를 실행시킵니다.
aws ecs create-service \
--cli-input-json file://nginxService.json
위 명령어에서 실행되는 json파일은 다음과 같습니다.
혹시 fargate가 아니라 ec2를 사용하는 ECS에 서비스를 배포하시려면
launchType과 platformVersion을 지우고 ECS의 용량공급자 관련 설정을 추가해주시면 됩니다.
{
"cluster": "discovery-test-cluster", # 클러스터이름
"serviceName": "my-user-serivce", # 생성될 ECS 서비스명
"taskDefinition": "nginx:39", # task-definition
"serviceRegistries": [
{
"registryArn": "arn:aws:servicediscovery:ap-northeast-2:038795414938:service/srv-xcjaqcoz5hlqowmu"
} # cloudMap 서비스의 Arn
],
"launchType": "FARGATE",
"platformVersion": "LATEST",
"networkConfiguration": {
"awsvpcConfiguration": {
"securityGroups": [ "sg-0a2cdfeb1d137aeb6" ],
"subnets": [ "subnet-06655d9d209a19ace" ]
}
},
"desiredCount": 2
}
아래는 위 명령어의 리턴값입니다.
4. 디스커버리 주소확인
ECS 서비스까지 생성되면 route53 호스팅 영역에서 만들어진 디스커버리 이름을 확인 할 수 있습니다.
private-dns-namespace는 vpc내 리소스들끼리만 유효하기에 bastian-host를 만들어 조회할수있습니다.
dig명령어로 조회 결과 user.dev도메인에 route53에 존재하는 A레코드 주소가 반환되었습니다.
ECS 서비스가 아닌 일반 EC2를 등록하여 private-dns-namespace 디스커버리하는법
일반적으로 ECS의 Fargate, ALB등의 리소스를 CloudMap에 등록하여 사용하지만
ec2 인스턴스 또한 cloud Map에 등록하여 디스커버리 가능합니다.
아래 명령어는 EC2 자신을 CloudMap에 등록하는 명령어입니다.
aws servicediscovery register-instance \
--service-id 'cloudMap의 서비스id' \
--instance-id $(ec2-metadata --instance-id | cut -d " " -f 2) \ # 등록하려는 ec2 instance-id
--attributes Key=Name,Value=$(ec2-metadata --instance-id | cut -d " " -f 2) \
--attributes=AWS_INSTANCE_IPV4=$(curl http://169.254.169.254/latest/meta-data/local-ipv4)
등록하고자 하는 ec2에 ssh에 접속하여 위 명령어를 실행하면 cloudMap Service에 해당 ec2가 등록됩니다.
route53에서도 등록된 ec2 A레코드를 확인 할 수 있습니다.
실습에 사용한 더 자세한 cli 명령어들은 아래 주소에서 확인 가능합니다.
https://docs.aws.amazon.com/cli/latest/reference/servicediscovery/index.html
'aws' 카테고리의 다른 글
Route53 Private Host존을 이용한 VPC간 Private Endpoint 공유 (0) | 2023.06.16 |
---|---|
CodeDeploy에서 ApplicationStop 에러날때 (0) | 2023.06.14 |
VPC의 리소스들에 대해 알아보자 (0) | 2023.04.16 |
CI/CD Pipeline - AWS CodePipeline을 통한 CICD 해보기 with Terraform (0) | 2023.03.05 |
ALB와 ASG 만들기 with Terraform (0) | 2022.12.02 |