본문 바로가기
공부/IaC

[Terraform/AWS] VPC Peering Module을 만들 때 고려할 점

by haejang 2022. 10. 30.
728x90
728x90

 

 

 

테라폼은 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

- 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_accepttrue 값을 넣을 수 없다.

이유를 곰곰히 생각해보면 당연한게, 모듈이 아닌 리소스에서 멀티 프로바이더를 설정하는 경우는 없고, 해당 프로바이더에서는 다른 프로바이더의 역할을 대신해줄 수 없기 때문이다.

즉, 콘솔에서 작업할 때도, 리전이든 계정이든 다른 콘솔로 넘어간 다음에 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

 

honglab-terraform/legacy/modules/networking/vpc_peering at master · suminhong/honglab-terraform

terraform by honglab. Contribute to suminhong/honglab-terraform development by creating an account on GitHub.

github.com

 

사실 귀찮아서 위 모듈을 직접 돌려 사용해보진 않았다. 에러 있으면 알려주시길,,,

 

need_accepter라는 local 변수를 만들어 사용했으며, 각 vpc의 id와 name을 input으로 받아 활용했다.

vpc_name의 경우에는 오로지 tag용이므로, 필요 없으면 알아서 바꿔서 사용하자.

 

실제 업무에 쓸 땐 routing table에 route까지 추가하도록 만들면 편하니 그렇게 고쳐 쓰자.

(그거까지 설명하기 귀찮아서 peering만 썼다)

 

끝!

 

 

728x90
728x90

댓글