AWS
Ansible
vpc
Inter-Region_VPC_Peering

AnsibleでAWSのリージョン間VPCピアリングを構築する(Inter-Region VPC Peering)

先月の2月22日、待ちにまったInter-Region VPC Peeringが東京リージョンにもやってきました :tada:

https://aws.amazon.com/jp/blogs/news/inter-region-vpc-peering-is-now-available-in-nine-additional-aws-regions/

Inter-Region VPC Peeringは世界中の(対応している)リージョンとVPC Peerを張れる機能です。
これで、今まで東京リージョンに来ていなかったAWSサービスを使う事が可能となります。
EC2 C5シリーズとか、ECS Fargateとか、Amazon EFSとか!

それでは、早速導入していきましょう。
Webコンソールからはボタン3つぐらいで出来るのですが
今回はAnsibleを使って構築していきます。

概要

Ansible2.5のec2_vpc_peerモジュールでpeer先のリージョンが指定できるようになります。
https://github.com/ansible/ansible/blob/stable-2.5/lib/ansible/modules/cloud/amazon/ec2_vpc_peer.py#L30-L34
Ansible2.5を待てない人や、何かしらの理由でアップデート出来ない人は
ライブラリに追加する事で利用ができます。

手順

Ansible2.5のモジュールをコピー

Ansible2.5にアップデート出来る人はこの対応が不要です。

ライブラリパスの通る場所に
上記ec2_vpc_peer.pyファイルを置いてしまいましょう。
ライブラリとAnsible本体に同盟のモジュールがある場合は
ライブラリのモジュールが優先されます。
一部機能だけ先に使いたい場合はダウンロードする事で
古いバージョンのまま新しいモジュールを使うことができます。

もちろん、依存関係があるモジュールなどは依存を気にする必要はありますが。

私の場合は以下のようなファイル構成にして利用しました。

vpc-create-role
user@my-serv:~/ansible-setup-repository/aws-vpc$ tree -a
.
├── library
│   ├── ec2_vpc_peer.py
│   ├── .gitignore
│   └── README.md
└── tasks
    └── main.yml

私はgitignoreで除外設定をしてREADME.mdに説明を書いていましたが
git submoduleなどで管理してもいいですね。

2つのリージョンのVPCを用意

VPC Peerを貼るVPCを用意します。

VPCを作る手順は省略します。
Qiitaにもいくつか記事がありますので、参考までにリンクを記載します。
https://qiita.com/search?q=VPC+ansible

この時、Peerを張る先のリージョンをきちんと確認しておきましょう。
(当然ですが…)。
東京リージョンに来ていないFargateやC5インスタンスはus-east-1リージョンで利用可能ですが
過去の障害実績や利用サービス、料金などを見てリージョンを選びましょう。

リージョンごとに利用できるサービス一覧は以下のページが参考になります。
https://aws.amazon.com/jp/about-aws/global-infrastructure/regional-product-services/
過去のリージョンごとの障害は以下の記事を見ておくと安心できます。
https://qiita.com/saitotak/items/07931343bcb703b101f8

Ansibleでピア設定

Ansible TaskでPeerの設定をします。
以下は参考までに私が記載したTaskです。

aws-vpc/tasks/main.yml
- name: Create Connection vpc-a_vpc-b
  ec2_vpc_peer:
    profile: "{{ vpc-a_profile }}"
    vpc_id: "{{ vpc-a_vpc_id }}"
    region: "{{ vpc-a_region }}"
    peer_owner_id: "{{ vpc-b_account_id }}"
    peer_vpc_id: "{{ vpc-b_vpc_id }}"
    peer_region: "{{ vpc-b_region }}"
    tags:
      Name: "{{ peer_name }}"
    state: present
  register: _vpc_peer

明確に変更があったのはpeer_regionパラメータだけですね。
その他には、ap-northeast-1固定だったリージョンを変数化していたります。

その後、Route Tableの設定なども必要ですが
これは普通のVPC Peer設定と変わらないですね。

最後に

これで東京リージョンに来ていないAWSサービスが利用しやすくなりました!

リージョン間の通信費など、考えないといけない事は残っていますが
別リージョンのサービスをVPC内で完結して利用できるので
導入のハードルがだいぶ下がったのではないでしょうか。