初めに
基本的にCloudFormationを使用してIaCを管理しているのですが、
なんと、、、
CloudFormationでは、PrefixlistをRouteTableに登録することができないとのこと。
参考:AWS::EC2::Route support for DestinationPrefixListId
CloudFormationでPrefixlistの作成はできるのに、RouteTableに登録できないなんて、、、と思っていても仕方ないので、
(実装時期も未定らしい。)
代案方法をまとめたいと思います。
今回は、boto3になります。
ちなみに、下記ツールならRouteTableにPrefixlistを登録することはできそうです。
- AWS CLI
- SDK
- boto3
- Terraform
boto3とは?
参考:ChatGPT
boto3は、PythonでAWSを操作するためのライブラリで、AWSのAPIにアクセスするためのクライアントライブラリです。AWSサービスの構成やデプロイの自動化に役立ち、PythonプログラムでAWSを簡単に操作できます。Python 2.6.5以上およびPython 3.3以上のバージョンで利用可能であり、AWSの多くのサービスに対応しています。クラウドインフラストラクチャの管理やデプロイに役立ちます。
構築環境
Python:3.11.0
実現したいこと
やりたいことは、単純です。
RouteTableのルートに、送信先をPrefixlist/ターゲットをインターネットゲートウェイとして登録するだけ。
aws cliでやるなら下記コマンドでになります。
aws ec2 create-route --destination-prefix-list-id [PrefixList_ID] --route-table-id [RouteTale_ID] --gateway-id [InternetGateway_ID]
やった内容
今回は、PrefixlistをRouteTableに登録するスクリプトファイルまでを記事にしたいと思います。
1. スクリプトファイルの作成
下記Pythonスクリプトファイルを作成します。
import boto3
client = boto3.client('ec2')
#各リソースのIDを記載
route_table_ids = ['rtb-056bfae20d21bac59', 'rtb-01d817248694ab7da']
destination_prefix_list_ids = ['pl-059875efe9b3ae7d2', 'pl-0cb544a048d31ec21']
gateway_id = 'igw-057f3d1e36a77648c'
#ループ処理で各RouteTableにPrefixlistを追加
for rtb_id in route_table_ids:
for pl_id in destination_prefix_list_ids:
try:
response = client.create_route(
DestinationPrefixListId=pl_id,
RouteTableId=rtb_id,
GatewayId=gateway_id
)
print(f"Route created for {rtb_id} and {pl_id}: Success")
except Exception as e:
print(f"Error creating route for {rtb_id} and {pl_id}: {e}")
2.コマンド実行
スクリプトファイルを実行します。Successの返答が来ていたら問題ないです。
$ python create_root.py
Route created for rtb-056bfae20d21bac59 and pl-059875efe9b3ae7d2: Success
Route created for rtb-056bfae20d21bac59 and pl-0cb544a048d31ec21: Success
Route created for rtb-01d817248694ab7da and pl-059875efe9b3ae7d2: Success
Route created for rtb-01d817248694ab7da and pl-0cb544a048d31ec21: Success
マネジメントコンソール上からも確認し、無事登録できてることがわかりました。
ちなみにエラーだと下記のようになります。
*故意にPrefixlist_IDを誤記
$ python create_root.py
Error creating route for rtb-01d817248694ab7da and pl-0cb544a048d31ec2d: An error occurred (InvalidPrefixListID.NotFound) when calling the CreateRoute operation: The prefix-list ID 'pl-0cb544a048d31ec2d' does not exist
エラー時の処理も問題ないことが確認できました。
まとめ
実際は、上記スクリプトファイルをLamda関数とかで作成し、Cloud Formationから呼び出してあげるのがIaCの手段の一つになってくると思いますが
それは、またの機会に。
いずれにせよ、CloudFormationでPrefixlistをRouteTableに登録できるようにしていただければ一番楽なので
アップデートを楽しみにしたいと思います。