CodeCommit を使用したユーザーの人数分よりも多く課金された場合の対処方法

2022.10.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

困っている内容

CodeCommit は 1 ユーザーにつき 1 度でも使用したら、その後は何度使っても、使用した月中は 1 USD のみ課金されると認識しているのですが、今月 1 人しか使用していないのに 2 USD 課金されていました。
CloudTrail で履歴を見てみましたが、やはり 1 人しか使用していませんでした。

1 人しか使用していなくても、2 人分課金されるケースはあるのでしょうか。

どう対応すればいいの?

CodeCommit では、固有の AWS Identity ごと、つまり CloudTrail に記録される userIdentity.arn の値ごとにアクティブユーザーとしてカウントされ、アクティブユーザー 1 人につき 1 USD/月課金されます。[1][2]

アクティブユーザーとは、その月に Git リクエストにより、または AWS マネジメントコンソール、AWS CLI、AWS SDK を使用して AWS CodeCommit リポジトリにアクセスする、すべての固有の AWS Identity (IAM ユーザー/ロール、フェデレーティッドユーザー、ルートアカウント) を指します。アクティブユーザーとしてカウントされるのは、AWS Identity が他の AWS のサービスの使用によって作成される場合です。これには、AWS CodeBuild や AWS CodePipeline、固有の AWS Identity を使用して CodeCommit にアクセスするサーバーなどが含まれます。

Q: AWS CodeCommit にはどのくらいの費用がかかりますか?
AWS CodeCommit の費用は、アクティブなユーザー 1 人につき 1 USD/月です。

例えば以下に記載されている IAM ユーザーは CodeCommit_ActiveUser の 1 人ですが、userIdentity.arn の値が異なる為、アクティブユーザーは 2 人としてカウントされ 2 USD 課金されます。

CodeCommit_CloudTrail_userIdentity.arn_example

# 1 人目
"userIdentity": {
~~~
        "arn": "arn:aws:iam::<アカウントID>:user/CodeCommit_ActiveUser",
~~~

# 2 人目
"userIdentity": {
~~~
        "arn": "arn:aws:sts::<アカウントID>:assumed-role/<ロール名>/CodeCommit_ActiveUser",
~~~

その為、CloudTrail で CodeCommit に対して複数の userIdentity.arn からアクセスしていないか確認してください。
もし意図しない userIdentity.arn からのアクセスがある場合は、CodeCommit へのアクセスを特定の userIdentity.arn に絞ることで想定外の課金を防げます。

マネジメントコンソールにおける CodeCommit 操作時の補足

マネジメントコンソールで CodeCommit を操作する場合、リポジトリの詳細まで開くとアクティブユーザーとしてカウントされます。

マネジメントコンソールにおける CodeCommit 操作時、どのタイミングでアクティブユーザーとしてカウントされるか検証した結果、リポジトリ一覧の表示までは ListRepositories と BatchGetRepositories という API コールが実行されていましたが、アクティブユーザーとしてはカウントされませんでした。

しかし、リポジトリの詳細を開くと GetObjectIdentifier 等の API コールが実行され、これによりアクティブユーザーとしてカウントされました。

AWS CLI における CodeCommit 操作時の補足

AWS CLI コマンド実行時にプロファイルの設定から自動で AssumeRole すると、CloudTrail にbotocore-session-1234567890のようなロールセッション名が記録されます。

CodeCommit_CloudTrail_AWS_CLI_RoleSessionName_example

"userIdentity": {
~~~
        "arn": "arn:aws:sts::<アカウントID>:assumed-role/<ロール名>/botocore-session-1234567890",
~~~

末尾の数字は現在の UNIX 時間が割り当てられる為[3]、一時的な認証情報の有効期限が切れた後再度 AssumeRole すると、CodeCommit では別のアクティブユーザーとしてカウントされ、課金の対象となります。

上記による課金を防ぎたい場合は、AWS CLI の~/.aws/configに記述のプロファイル情報にて、role_session_nameを使用して明示的にロールセッション名を指定してください。
これによって、AWS CLI による AssumeRole の際に指定したロールセッション名が使用されるようになります。
role_session_nameの詳細や設定方法については、[4][5]が参考になると思います。

参考資料

[1] 料金 - Amazon CodeCommit
[2] よくある質問 - Amazon CodeCommit
[3] botocore/credentials.py
[4] AWS CLI Configuration Variables — AWS CLI 2.8.0 Command Reference
[5] AWS CLIがAssumeRoleする際のセッション名を指定する