테라폼은 aws의 api를 사용해서 aws의 리소스를 제어한다.
aws의 콘솔은 aws에서 api를 ui로 보기좋게(?) 제공하는 서비스이기 때문에, api를 직접 쓰는 것과는 다른 점들이 존재한다.
(콘솔에선 못하지만 api로는 가능한 작업이 있는 점 등등..)
따라서 aws의 콘솔 작업과 aws api 작업 은 차이점이 분명히 존재하며,
멱등성을 제공하는 IaC도구인 terraform의 경우 별도로 고려해야 할 점들이 불가피하게 생긴다.
그 중에서도 최근에 날 괴롭혔던게(?) VPC Peering이었는데,
너무 쉬운 서비스라고 평소에 생각해왔기 때문에 의외로 애를 더 먹어버렸다.
바로 가보자!
# 확장성(multi provider)을 고려한 Peering Module
지금까지 TGW를 메인으로 써왔기 때문에, VPC Peering을 multi account & region으로 구성하는 일이 많이 없었고,
따라서 이를 테라폼으로 구성해두지 않았었다.
그리고 사실 다른계정이나 같은계정이나 VPC Peering 맺는 방식이 콘솔 내에선 똑같기 때문에,
Terraform으로 작업하는 방식이 다를거라고 생각하지 않았다.
# auto_accept의 의미?
VPC Peering connection 관련해서, Terraform에는
- aws_vpc_peering_connection_accepter
라는 리소스들이 있으며, 각 리소스들엔 auto_accept
라는 argument가 들어갈 수 있다
나는 도큐를 제대로 읽지도 않은 채, auto_accept = true
면 connection accepter가 별도로 필요 없는 구조라고만 생각했다.
(single account & region에서는 그게 제대로 동작)
(다만 aws_vpc_peering_connection_accepter
블럭에 auto_accept
란 인자가 들어갈 수 있는 이유를 설명하지 못함)
그래서 이는,,,제대로 정리해본다면,,,
account와 region이 동일한 경우 (즉, 같은 terraform provider를 사용하는 경우) 엔 accepter가 필요 없다.
위 경우에선 auto_accept = true
설정만 있다면 connection 리소스만 가지고도 peering이 제대로 설정된다.
그러나 둘 중 하나라도 다른 경우 (다른 terraform provider를 사용하는 경우)는 accepter가 별도로 필요하며, connection 리소스에서 auto_accept
에 true
값을 넣을 수 없다.
이유를 곰곰히 생각해보면 당연한게, 모듈이 아닌 리소스에서 멀티 프로바이더를 설정하는 경우는 없고, 해당 프로바이더에서는 다른 프로바이더의 역할을 대신해줄 수 없기 때문이다.
즉, 콘솔에서 작업할 때도, 리전이든 계정이든 다른 콘솔로 넘어간 다음에 accept를 해줘야한다는 것과 동일할 것 같다.
따라서 다른 프로바이더 간 peering의 경우에만 accepter 리소스를 별도로 만들어줘야 한다.
# aws_vpc_peering_connection_options
Peering엔 DNS Resolution을 전달하는 Option이 있다.
VPC 자체에 DNS가 활성화 되어있어야 가능하긴 한데, 웬만하면 다 키는게 맞다.
요것도 requester & accepter에서 각각 설정을 해줘야 하기 때문에, single provider / multi provider 설정하는 법이 달라진다.
# 진짜 코드
이제 입은 다 털었으니, 코드 직접 보고 갖다 쓰자.
https://github.com/suminhong/honglab-terraform/tree/master/legacy/modules/networking/vpc_peering
사실 귀찮아서 위 모듈을 직접 돌려 사용해보진 않았다. 에러 있으면 알려주시길,,,
need_accepter
라는 local 변수를 만들어 사용했으며, 각 vpc의 id와 name을 input으로 받아 활용했다.
vpc_name
의 경우에는 오로지 tag용이므로, 필요 없으면 알아서 바꿔서 사용하자.
실제 업무에 쓸 땐 routing table에 route까지 추가하도록 만들면 편하니 그렇게 고쳐 쓰자.
(그거까지 설명하기 귀찮아서 peering만 썼다)
끝!
'공부 > IaC' 카테고리의 다른 글
[Terraform] Plan만 가능한 권한? (0) | 2023.05.15 |
---|---|
[Terraform/AWS] EC2를 Directory Service에 Seamlessly하게 join시키기 (0) | 2023.01.16 |
[Terraform/k8s] k8s YAML 리소스로 Terraform Code를 쉽게 작성하는 3가지 방법 (0) | 2022.08.21 |
[Terraform/EKS/k8s] import 시 Kubernetes: Unauthorized (1) | 2022.06.28 |
[Terraform] MAC에서 tfenv로 terraform 특정 버전 사용 (1) | 2022.05.14 |
댓글