先日、待ちに待った AWS 公式の aws-cli イメージ がついに公開されました。
というわけで早速 CircleCI で使ってみたのですが、少しだけハマったので共有します。
結論から
CircleCI で amazon/aws-cli
イメージを使う場合は環境変数 AWS_PAGER
に空文字を設定しましょう。
version: 2.1
executors:
aws-cli:
environment:
AWS_DEFAULT_REGION: ap-northeast-1
AWS_PAGER: "" # ここが重要
docker:
image: amazon/aws-cli
jobs:
build:
executor: aws-cli
steps:
- aws codebuild start-build --project-name myproject
解説
もともと CircleCI Orbs の circleci/aws-cli@0.1.22
を使っていたのですが、せっかく公式の Docker イメージが出たので乗り換えようと次のような設定を書いてみました。
version: 2.1
executors:
aws-cli:
environment:
AWS_DEFAULT_REGION: ap-northeast-1
docker:
image: amazon/aws-cli
jobs:
build:
executor: aws-cli
steps:
- aws codebuild start-build --project-name myproject
AWS_ACCESS_KEY_ID
と AWS_SECRET_ACCESS_KEY
は CircleCI コンソールからの設定で環境変数に入れる想定です。
CircleCI から AWS CodeBuild をキックするという回りくどいことをしていますが、故あって CircleCI で特定の Workflow を経た上で CodeBuild でのビルドを実行したかったのでこのような形となっています(Workflow 周りの設定は省略しています)。
この設定で CircleCI のジョブを実行してみると、CodeBuild は問題なくキックされましたが CircleCI 側のジョブが永久に終了せずタイムアウトするという問題が発生してしまいました。
ログを見ると以下のような感じです。
aws codebuild start-build --project-name myproject
WARNING: terminal is not fully functional
- (press RETURN){
... (以下略) ...
ユーザーからの入力を待っている感じですね。。。
CircleCI Orbs を使っていた時はうまくいっていたのに何故?
と考えると、怪しいのは AWS CLI のバージョンです。
amazon/aws-cli
イメージは AWS CLI v2 のみをサポートしています。一方で、CircleCI Orbs の circleci/aws-cli@0.1.x
は AWS CLI v1 のみをサポートしています(ちなみに 2020/03/31 にリリースされた circleci/aws-cli@1.0.0
からは v1 と v2 の両方がサポートされるようになり、デフォルトは v2 となっています)。
というわけで AWS CLI v1 と v2 の違いを調べてみたら原因はあっさりと判明しました。
以下公式ドキュメントからの引用
デフォルトでは、AWS CLI バージョン 2 はオペレーティングシステムのデフォルトのページャープログラムを介してすべての出力を返します。デフォルトでは、このプログラムは Linux および macOS では less プログラム、Windows では more プログラムです。これにより、出力を一度に 1 ページずつ表示することで、サービスからの大量の出力内を簡単に移動できます。
つまり、AWS CLI v2 からはページャーがデフォルトで有効になっているので実行時に入力待ちの状態となってしまってジョブが終わらなくなっていたわけですね。
再び公式ドキュメントからの引用
ただし、スクリプトを実行しているときなどに、キーを押して各ページを取得することは不要で、すべての出力が必要な場合があります。これを行うには、別のページングプログラムを使用するか、まったく使用しないように AWS CLI バージョン 2 を設定できます。そのためには、~/.aws/config ファイルに AWS_PAGER 環境変数または cli_pager 設定を含め、使用するコマンドを指定します。
以下の例に示すように、変数を空の文字列に設定することで、外部ページングプログラムの使用を完全に無効にすることができます。
ということなので、(CircleCI に限った話ではありませんが) AWS_PAGER
に空文字を設定してあげるとうまく動作します。
version: 2.1
executors:
aws-cli:
environment:
AWS_DEFAULT_REGION: ap-northeast-1
AWS_PAGER: ""
docker:
image: amazon/aws-cli
jobs:
build:
executor: aws-cli
steps:
- aws codebuild start-build --project-name myproject