Posted at

VPCサブネットのRouteTableを切り替える

More than 3 years have passed since last update.


マネジメントコンソールでのRouteTable切り替え

VPCサブネットに紐付いているRouteTableを切り替える必要がある場合、

マネジメントコンソールからだとVPC=>Subnets=>サブネットを選択=>RouteTableタブのEditボタンを押すことでサブネットに紐付けるRouteTableを選択できます。

routetableの切り替え.png

簡単です。


AWSCLIでのRouteTable切り替え

しかし、特定のトリガーをきっかけにRouteTableを自動的に切り替えたい場合にはAWSCLIを使ったスクリプトを書く必要があるのですが、ひとクセありました。

まず、一番最初にサブネットとルートテーブルの紐付けを行う場合は「associate-route-table」コマンドで【route-table-id】と【subnet-id】を紐付けます。(デフォルトで作成されるVPCでは紐付け済み)

この【route-table-id】と【subnet-id】の紐付けに対して、【association-id】が割り振られます。【association-id】は「describe-subnets」コマンドで確認できます。

(現状ではマネジメントコンソールからは【association-id】を確認できませんでした。)

aws ec2 describe-route-tables

-----------
{
"RouteTables": [
{
"Associations": [
{
"SubnetId": "subnet-xxxxxxxx",
"RouteTableAssociationId": "rtbassoc-xxxxxxxx",
"Main": false,
"RouteTableId": "rtb-xxxxxxx"
}
],
:
:
}
--------

上記のように、サブネット:subnet-xxxxxxxxとルートテーブル:rtb-xxxxxxxの紐付けが、rtbassoc-xxxxxxxxというAssociationIdで管理されています。

そして本題のすでにルートテーブルが紐付けられたサブネットのCLIでのRouteTable切り替えには「replace-route-table-association」コマンドを使うのですが、前述の「associate-route-table」のように【route-table-id】と【subnet-id】を紐付けるのではなく、【route-table-id】と【association-id】を紐付ける必要があります。さらに【association-id】は紐付けのたびに毎回値が変化するので、注意が必要です。

aws ec2 replace-route-table-association --association-id rtbassoc-xxxxxxxx  --route-table-id rtb-xxxxxxxx

-----------
{
"NewAssociationId": "rtbassoc-xxxxxxxxx"
}
-----------

このような形で新しいAssociationIdが結果として戻って来れば、切り替えが成功です。

ちなみに、紐付け済みの【subnet-id】と【route-table-id】を「associate-route-table」コマンドを使用するとこんな感じで怒られます。

aws ec2 associate-route-table --subnet-id subnet-xxxxxxxxx  --route-table-id rtb-xxxxxxxx

-----------
A client error (Resource.AlreadyAssociated) occurred when calling the AssociateRouteTable operation: the specified association for route table rtb-xxxxxxx conflicts with an existing association
-----------