公開日:2021.08.11

Windows(Cygwin)で AWS CLI を Docker 経由で使いたい時に気を付けること

テクログaws

要点

Windows(Cygwin)かつ Docker 経由で AWS CLI を使いたい時、以下に気を付ける必要があります。

  • Docker Desktop のバージョンによって、マウントするディレクトリのパスの書き方が違う
  • Docker 経由の場合、シェルスクリプトなどで AWS CLI を使いたい場合に少し工夫が必要

背景

  • Windows、しかも Cygwin 上で AWS CLI を使いたい
  • AWS プロファイル名を変えれば CloudShell などでそのまま使用できる
  • AWS 公式が用意している Docker イメージを使うようにしたい
  • バージョン管理が楽
  • 依存関係が他アプリケーションとぶつかることを考えなくていい

Cygwin って何?

「そもそも Cygwin って何?」となる人も居ると思います。

Cygwin は簡単に言えば、「Windows 上で Unix ライクな環境をする互換レイヤー」です。

仮想マシンなどを走らせることなく、Windows 上で Linux コマンドを使うことができます。

Windows マシン上で Linux と同じスタイルで色々やりたい場合にとても便利です。

Linux コマンドを使用できるので、Linux をある程度知っていれば、「あるディレクトリ内部のファイル内からの指定文字列の検索」などをサクッとできます。

Windows 10 からは Windows Subsystem for Linux (WSL) が存在するので、好きな方を利用すればいいと思います。

私は WSL 登場前から Cygwin を使っており、初期の WSL が不安定だったこともあり、今も Cygwin 派です。

Cygwin でAWS CLI(AWS 公式 Docker 経由)を使う(本題)

前提条件

  • Docker Desktop がインストール済み
  • Cygwin がインストール済み
  • Cygwin ターミナルは bash を使用

1. ~/.bashrc に alias を用意

まず Cygwin 上で ~/.bashrc に docker コマンドの alias を追加します。

以下、 ユーザー名 user の場合の追加例です。

# Cygwin 内で Windows 用のパス形式にカレントディレクトリのパスを変換
function pwdwin(){
  cygpath -pw $PWD | sed "s//\/g"
  # cygpath -pw $PWD
}

# AWS CLI 実行用 alias
alias aws="docker run --rm -it -v "C:cygwin64homeuser.aws":/root/.aws -v "`pwdwin`":/aws  --env AWS_PAGER=""  amazon/aws-cli"

関数 pwdwin で Cygwin 上のカレントディレクトリを Windows の DOS 形式の絶対パスに変換しています。

これは、Docker Desktop 2.3.0 あたりから「Unix 形式でディレクトリのパスを指定するとマウントに失敗する」というバグ(あるいは仕様変更)があったので入れています。

この時点で以下を実行すれば、既に aws コマンドでの AWS CLI実行可能になっています。

source ~/.bashrc

Cygwin ターミナルの次回起動時からは aws コマンドで AWS CLI を呼べるようになっています。

各ディレクトリでの初回実行時は、マウントを許可するかの通知が出るので許可してください。

この時点で9割くらいは終わりです。

2. Cygwin のシェルスクリプト内で AWS CLI を使えるようにする

上記の方法の場合、Cygwin のシェルスクリプト内で AWS CLI を実行するにはシェルスクリプト内で alias を毎回定義する必要があります。

それだと大変なので、

source ~/.bashrc

をシェルスクリプト内で実行します。

他の方法もあるにはありますが、この方法が1番失敗し辛いと思います。

まとめ

Windows(Cygwin)で AWS CLI を Docker 経由で利用する場合、以下2点に気を付ける必要があります。

  • マウントするディレクトリのパスの書き方が DOS 形式になっているので、Cygwin 上の Unix 形式のパスでは上手くいかない
  • Docker 経由の場合、シェルスクリプト内でで AWS CLI を使いたい場合は alias を読み込む必要がある

この記事を書いた人

Hary

入社年2020年

出身地山口

業務内容インフラ

特技または趣味ゲーム

Haryの記事一覧へ

テクログに関する記事一覧