2021.08.11
STAFF BLOG
スタッフブログ
TECHNICAL
テクログ
要点
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 を読み込む必要がある