こんにちは、岩城です。
先週、タイトルのアップデートがありましたので紹介します。
忙しい人向けまとめ
create-route-table
とcreate-network-acl
APIにclient-token
パラメータが追加- クライアントトークンを利用する冪等性がサポート
- これまで実行した分だけリソースが作成され、当然リソースIDなどの成功が変わり全く別の実行結果が返ってきてた
- クライアントトークンおよび設定値が同じリクエストであれば、何度実行しても同じ実行結果が返ってくる
- クライアントトークンが同一、設定値が違う場合
IdempotentParameterMismatch
エラーにより実行できない client-token
には最大64個・大小区別されるASCII文字列を指定可能
やってみた
AWS CLIv2を利用して試します。古いバージョンではclient-token
パラメータがサポートされていないので、最新バージョンを利用します。
$ aws --version
aws-cli/2.15.15 Python/3.11.6 Linux/6.1.66-91.160.amzn2023.x86_64 exec-env/CloudShell exe/x86_64.amzn.2023 prompt/off
まずはclient-token
パラメータを使わずにcreate-route-table
とcreate-network-acl
を複数回実行してみます。
#ルートテーブル作成
aws ec2 create-route-table --vpc-id vpc-0d92a005e4a04c6a1 --tag-specifications ResourceType=route-table,Tags=[{'Key=Name,Value=devio-route-table'}]
#ネットワーク ACL作成
aws ec2 create-network-acl --vpc-id vpc-0d92a005e4a04c6a1 --tag-specifications ResourceType=network-acl,Tags=[{'Key=Name,Value=devio-network-acl'}]
実行した分だけ以下のように各リソースが作成されてしまいます。
#ルートテーブル
$ aws ec2 describe-route-tables --filters 'Name=tag:Name,Values=devio-route-table' --query 'RouteTables[*].{ID:RouteTableId,Name:Tags[?Value==`devio-route-table`].Value|[0]}' --output table
------------------------------------------------
| DescribeRouteTables |
+------------------------+---------------------+
| ID | Name |
+------------------------+---------------------+
| rtb-061ead30052335fd1 | devio-route-table |
| rtb-0890dacb4995191b1 | devio-route-table |
| rtb-09be6997dc2f7a55b | devio-route-table |
+------------------------+---------------------+
#ネットワークACL
$ aws ec2 describe-network-acls --filters 'Name=tag:Name,Values=devio-network-acl' --query 'NetworkAcls[*].{ID:NetworkAclId,Name:Tags[?Value==`devio-network-acl`].Value|[0]}' --output table
------------------------------------------------
| DescribeNetworkAcls |
+------------------------+---------------------+
| ID | Name |
+------------------------+---------------------+
| acl-0e8d29e9be9dd6712 | devio-network-acl |
| acl-019464c82365d3798 | devio-network-acl |
| acl-0872a3bc9078bd056 | devio-network-acl |
+------------------------+---------------------+
意図せず実行してしまった場合、不要なリソースは削除しないといけないので手間ですよね。
そこでclient-token
を利用します。同じクライアントトークン、同じ設定値であれば何度実行しても同じ実行結果を返します。
何度実行しても同じ結果となるので冪等性があります。何度実行してもエラーにはならないが、異なるリソースがその分作成されるのは冪等性があるとは言えません。
リソース名の末尾に2
、client-token
パラメータを付与して複数回実行してみます。
#ルートテーブル
$ aws ec2 create-route-table --vpc-id vpc-0d92a005e4a04c6a1 --tag-specifications ResourceType=route-table,Tags=[{'Key=Name,Value=devio-route-table2'}] --client-token 550e8400-e29b-41d4-a716-446655440000
{
"RouteTable": {
"Associations": [],
"PropagatingVgws": [],
"RouteTableId": "rtb-08d275e61da9646ab",
"Routes": [
{
"DestinationCidrBlock": "10.0.0.0/16",
"GatewayId": "local",
"Origin": "CreateRouteTable",
"State": "active"
}
],
"Tags": [
{
"Key": "Name",
"Value": "devio-route-table2"
}
],
"VpcId": "vpc-0d92a005e4a04c6a1",
"OwnerId": "992031286038"
},
"ClientToken": "550e8400-e29b-41d4-a716-446655440000"
}
#ネットワークACL
$ aws ec2 create-network-acl --vpc-id vpc-0d92a005e4a04c6a1 --tag-specifications ResourceType=network-acl,Tags=[{'Key=Name,Value=devio-network-acl2'}] --client-token 550e8400-e29b-41d4-a716-446655440000
{
"NetworkAcl": {
"Associations": [],
"Entries": [
{
"CidrBlock": "0.0.0.0/0",
"Egress": true,
"IcmpTypeCode": {},
"PortRange": {},
"Protocol": "-1",
"RuleAction": "deny",
"RuleNumber": 32767
},
{
"CidrBlock": "0.0.0.0/0",
"Egress": false,
"IcmpTypeCode": {},
"PortRange": {},
"Protocol": "-1",
"RuleAction": "deny",
"RuleNumber": 32767
}
],
"IsDefault": false,
"NetworkAclId": "acl-069a45219f569818e",
"Tags": [
{
"Key": "Name",
"Value": "devio-network-acl2"
}
],
"VpcId": "vpc-0d92a005e4a04c6a1",
"OwnerId": "992031286038"
},
"ClientToken": "550e8400-e29b-41d4-a716-446655440000"
}
何度実行しても上のような同じ実行結果が返ってきます。当然作成されるリソースは一つだけです。
#ルートテーブル
aws ec2 describe-route-tables --filters 'Name=tag:Name,Values=devio-route-table2' --query 'RouteTables[*].{ID:RouteTableId,Name:Tags[?Value==`devio-route-table2`].Value|[0]}' --output table
-------------------------------------------------
| DescribeRouteTables |
+------------------------+----------------------+
| ID | Name |
+------------------------+----------------------+
| rtb-08d275e61da9646ab | devio-route-table2 |
+------------------------+----------------------+
#ネットワークACL
$ aws ec2 describe-network-acls --filters 'Name=tag:Name,Values=devio-network-acl2' --query 'NetworkAcls[*].{ID:NetworkAclId,Name:Tags[?Value==`devio-network-acl2`].Value|[0]}' --output table
-------------------------------------------------
| DescribeNetworkAcls |
+------------------------+----------------------+
| ID | Name |
+------------------------+----------------------+
| acl-069a45219f569818e | devio-network-acl2 |
+------------------------+----------------------+
同じクライアントトークンで別名リソースを作成するとIdempotentParameterMismatch
が出力し作成できませんでした。
$ aws ec2 create-network-acl --vpc-id vpc-0d92a005e4a04c6a1 --tag-specifications ResourceType=network-acl,Tags=[{'Key=Name,Value=devio-network-acl3'}] --client-token 550e8400-e29b-41d4-a716-446655440000
An error occurred (IdempotentParameterMismatch) when calling the CreateNetworkAcl operation: Wrong arguments for request with token 550e8400-e29b-41d4-a716-446655440000
また、クライアントトークンを使用して作成したリソースを削除した直後に同じクライアントトークンで作成しようとしても、削除されたリソースに関連しているためエラーとなりました。
少し時間を空ければ作成できるようになることを確認しています。
$ aws ec2 create-route-table --vpc-id vpc-0d92a005e4a04c6a1 --tag-specifications ResourceType=route-table,Tags=[{'Key=Name,Value=devio-route-table'}] --client-token 550e8400-e29b-41d4-a716-446655440000
An error occurred (IdempotentParameterMismatch) when calling the CreateRouteTable operation: An error occurred (IdempotentParameterMismatch) when calling this operation: The client token and arguments used in this request were used in a prior request that was associated with a resource which is now deleted.
おわりに
本エントリを執筆するうえで一番苦労したのは、CLIの結果を表形式に出力するところでした。
毎度フィルターパターン、クエリの書き方を忘れてしまうのでなんとかしたいです。
本エントリがどなたかのお役に立てれば幸いです。