BioErrorLog Tech Blog

試行錯誤の記録

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が付与されているのにも関わらず、です。)

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

# 作業環境
$ cat /etc/system-release
Amazon Linux AMI release 2018.03

エラー対処

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

このエラーが起きたのは、(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の認証機構の不思議に感動したものでした。

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

[関連記事]

www.bioerrorlog.work

www.bioerrorlog.work

www.bioerrorlog.work

参考

AWS Cloud9

Troubleshooting AWS Cloud9 - AWS Cloud9