🐳
パイプラインでAWS CLI(Docker)を利用する際の注意点
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