Cloud9エラー: An error occurred (ExpiredToken) when calling the XXX operation: The provided token has expired.

AWS Cloud9のエラーAn error occurred (ExpiredToken) when calling the XXX operation: The provided token has expired.の対処法を記します。



はじめに

Cloud9を使っていた際に、次のようなエラーに出会いました。

$ aws s3 ls
An error occurred (ExpiredToken) when calling the ListBuckets operation: The provided token has expired.

上の例はaws cliでListBucketsしようとしたときに表示されたものですが、それ以外のいかなるAWSサービスへもアクセスできませんでした。

(この時、IAMユーザーにはAdministratorAccessが付与されているのにも関わらず、です。)

このエラーへの対処法を備忘録として残します。


作業環境

今回はAmazon LinuxのCloud9で作業しました。

$ cat /etc/system-release
Amazon Linux AMI release 2018.03


解決策: Cloud9環境のOwnerにログインしてもらう

まず、この解決策の大前提として、今回のエラーが起きたのは
Cloud9環境に招待されたIAMユーザーである、とします。

このときの解決策は単純で、
Cloud9環境のOwnerに、Cloud9にログインしてもらう
というものです。


Cloud9アクセス権限の仕組み

この問題の背景にある仕組みを少し説明します。

まず、Cloud9でのアクセス権限は少し複雑で、
IAMユーザーの権限 + temporary credentials(一時認証情報)
で決まります。

以下、ドキュメント抜粋です。

  1. AWS Cloud9 checks to see if the calling AWS entity (for example, the IAM user) has permissions to take the requested action for the requested resource in AWS. If the permission doesn't exist or is explicitly denied, the request fails.

  2. AWS Cloud9 checks AWS managed temporary credentials to see if its permissions allow the requested action for the requested resource in AWS. If the permission doesn't exist or is explicitly denied, the request fails. For a list of permissions that AWS managed temporary credentials support, see Actions Supported by AWS Managed Temporary Credentials.

  3. If both the AWS entity and AWS managed temporary credentials allow the requested action for the requested resource, the request succeeds.

  4. If either the AWS entity or AWS managed temporary credentials explicitly deny (or fail to explicitly allow) the requested action for the requested resource, the request fails. This means that even if the calling AWS entity has the correct permissions, the request will fail if AWS Cloud9 doesn't also explicitly allow it. Likewise, if AWS Cloud9 allows a specific action to be taken for a specific resource, the request will fail if the AWS entity doesn't also explicitly allow it.

つまり、Cloud9からAWSサービスへのアクセスが要求された際、次のように権限がチェックされます。

  1. Cloud9を操作するAWSエンティティ(IAMユーザーなど)がその権限を持っているか
  2. Cloud9に付与された一時認証情報がその権限を持っているか
  3. これらチェックが両方通ったときのみ、アクセスを許可する

ここでCloud9環境に招待されたユーザーにとってネックとなるのは、一時認証情報の方です。

一時認証情報は、その名の通り一時的に付与されるアクセス権限です。

大抵の操作に対するアクセスが許可されていますが、一定時間後(デフォルトで12時間)にその認証は切れてしまいます。

Cloud9環境のOwner(そのCloud9の作成者)が作業している間は5分毎に一時認証情報が更新されますが、招待者が単独で作業する場合は、Ownerログアウトの12時間後で一時認証情報が無効になってしまうことになります。


よって、再びOwnerにCloud9を開いてもらうことで一時認証情報が更新され、AWSサービスにアクセスできるようになる、ということです。


おわりに

Cloud9に招待されたユーザーで陥りがちなエラーの対処法を書き記しました。

はじめてこのエラーに遭遇した時は、Cloud9の認証機構の神秘に、感動(と一握の憎悪)したものでした。

同じ状況のどなたか、役に立てば幸いです。


参考

Access Permissions Reference for AWS Cloud9 - AWS Cloud9

Troubleshooting AWS Cloud9 - AWS Cloud9