見出し画像

【AWS備忘録】ecs-cliにて「UnrecognizedClientException: The security token included in the request is invalid.」が発生

こんにちはこぐまです。

AWS備忘録です。
ecs-cliコマンドを利用していたとある処理が、先日以下のエラーを出力しました。

[ec2-user@ip-xxx-xxx AAA]$ ecs-cli compose ps
ERRO[0000] Error listing tasks                           
error="UnrecognizedClientException: The security token included in the request is invalid.
\n\tstatus code: 400, request id: XXXXX" 
request="{xxxxxxx}"
FATA[0000] UnrecognizedClientException: The security token included in the request is invalid.
        status code: 400, request id: XXXXX 

UnrecognizedClientException: The security token included in the request is invalid.\n\tstatus code: 400, request id: XXXXX"


今日はその備忘録です。

結論

1.「AWS CLI」と「ecs-cli」のクレデンシャル情報が異なっていた かつ
2.削除したアクセスキーの情報を参照していた。

メモ解説

AWSサービスの操作をEC2インスタンスなどからコマンドで実行する方法として「AWS CLI」があるかと思いますが、特にECSの操作に特化したCLIとして「ecs-cli」なるものがあります。

しかし残念ながら現在ではあまりアクティブな開発はされていないようです。(代わりにAWS Copilot CLIというものが利用されるようになっています。)また、ECS周りの操作はAWSCLI側でも対応できる(aws ecs list-services等)ので、ますます存在感が薄れている印象があります。

EC2インスタンス上で「ecs-cliコマンド」を実行するには、AWSCLIと同様に認証情報(アクセスキー、シークレットアクセスキー)が必要です。
そして、以下の特徴があります。

ecs-cli用の認証情報が別に定義されている場合は、そちらを利用し、
そうでない場合は、AWSCLIの認証情報を利用する。
(ただしコマンド実行時に明示的に指定した場合はそちらを優先する)

ecs-cliは独自の認証情報を持つことができます。これはコマンド実行ユーザのホームディレクトリ(/home/ec2-userなど)配下に「.ecs/credentials」として定義することができます。定義の記載方法はAWSCLIの時と同じです。

★AWSCLI認証情報の定義例(~/.aws/credentials)
[default]
aws_access_key_id = XXXXXXX
aws_secret_access_key = YYYYYY
 
★ecs-cli認証情報の定義例(~/.ecs/credentials)
version: v1
default: test
ecs_profiles:
  test:
    aws_access_key_id: XXXXXXX
    aws_secret_access_key: YYYYYYY

AWSCLIとecs-cliには別々の認証情報を記載することは可能ですが、記載した認証情報に相当するアクセスキーがIAM側で定義されていない場合、以下エラーとなります。

UnrecognizedClientException: The security token included in the request is invalid.\n\tstatus code: 400, request id: XXXXX"

背景

「TrustedAdvisor」にて「ローテーションされていない古いアクセスキーが存在します」という警告が出ていたので、アクセスキーを新規作成、古いアクセスキーを削除しました。
AWSCLI側の認証情報(.aws/credentials)は新しいアクセスキーを利用するように変更したのですが、ecs-cli側にも認証情報がセットされていることを失念していて、そちらを変更しないまま旧アクセスキーを削除したので上記のエラーに遭遇しました。

対応として、実行ユーザ配下の「.ecs/credentials」ファイルを参照しないようにリネームしました。(「credentials」→「_credentials.back」など)
そうすると、「./aws/credentials」ファイルを参照するようになり、新しいアクセスキー情報にてコマンドが正常終了することを確認できました。

対処としては済んだのですが、今後の対応としては、ecs-cliコマンドを利用している部分をAWSCLI側のコマンド(aws ecs ・・・)に統一することを検討したいと思います。そのうえで、IAMロール(EC2インスタンスプロファイル)を利用することですね。IAMロールの場合はいちいちアクセスキーを更新する作業が不要となります。なぜIAMロールが便利なのか、実体験で学ぶことができました。

読んで下さってありがとうございました!

この記事が参加している募集

この記事が気に入ったらサポートをしてみませんか?