マネジメントコンソールでのRouteTable切り替え
VPCサブネットに紐付いているRouteTableを切り替える必要がある場合、
マネジメントコンソールからだとVPC=>Subnets=>サブネットを選択=>RouteTableタブのEditボタンを押すことでサブネットに紐付けるRouteTableを選択できます。
簡単です。
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
-----------