🐳

パイプラインでAWS CLI(Docker)を利用する際の注意点

2024/12/31に公開

AWS CLIのバージョン2からDockerでの実行ができます。自分の場合、よくPythonのバージョンが不整合になったりして面倒なので、Dockerを利用しています。

利用方法

公式ドキュメントの記載通り、以下のコマンドでOKです。

$ docker run --rm -it amazon/aws-cli:2.0.6 command

さらに、エイリアスを作成することでdockerを気にすることなくCLIを利用できます。.bashrcや.zshrcに設定しておきましょう。

$ alias aws='docker run --rm -it -v ~/.aws:/root/.aws -v $(pwd):/aws amazon/aws-cli:2.0.6'

問題

[小ネタ] CloudWatch メトリクスのグラフをローカルに保存しちゃうぞ!の記事を参考にCloudWatchのグラフをPNGで保存してみます。

$ aws cloudwatch get-metric-widget-image --metric-widget file://metrics.json --output-format "png" --output text --query MetricWidgetImage | base64 --decode > metrics.png
# aliasを使用していない場合
$ docker run --rm -it -v ~/.aws:/root/.aws -v $(pwd):/aws amazon/aws-cli:2.0.6 cloudwatch get-metric-widget-image --metric-widget file://metrics.json --output-format "png" --output text --query MetricWidgetImage | base64 --decode > metrics.png

CloudWatchでのグラフのJSONでの設定からAWS CLIでbase64形式で取得し、標準出力で画像ファイルに出力するという仕組みです。
実際に実行してみるとInvalid character in input stream.となり、上手くいきません。

-tはつけない

一旦、取得結果をtemp.txtに出力してみます。

$ docker run --rm -it -v ~/.aws:/root/.aws -v $(pwd):/aws amazon/aws-cli:2.0.6 cloudwatch get-metric-widget-image --metric-widget file://metrics.json --output-format "png" --output text --query MetricWidgetImage > temp.txt

実際に出力した文字列を確認すると、 [mと余計な文字列が含まれてしまっています。

...(省略)...[m 
...(省略)... [m

-i-tについて

-tのオプションはpseudo-TTYを割り当てるオプションであり、実際に以下のようにbash等を利用する際には擬似端末を割り当てることでinteractiveな操作を行うことができます。

$ docker run --rm -it nginx bash 
root@b929c63b8e08:/# 
# ↑擬似端末が立ち上がる

-iのオプションを利用することで標準入力を受け付けるため、-itの指定で擬似端末による操作が行えます。

回避手段

はっきり、原因が分からないのですが、今回の問題は-tオプションをつけてttyを割り当てた際の出力に問題があるのかなと思いました。そのため、回避手段としてはオプションで指定している-tのオプションを入れないことです。コマンドは以下です。

$ docker run --rm -i -v ~/.aws:/root/.aws -v $(pwd):/aws amazon/aws-cli:2.0.6 cloudwatch get-metric-widget-image --metric-widget file://metrics.json --output-format "png" --output text --query MetricWidgetImage | base64 --decode > metrics.png

参考

Discussion