6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Docker で十全に gcloud や aws 、cdk コマンドなどを使う方法

Last updated at Posted at 2021-12-04

インフラエンジニア、 SRE などをしていると gcloudaws を両方利用するようなことも多いと思います。

それぞれ python 環境に依存しているため、場合によってインストールやアップデート時に苦労したり、 普段 python を使わないがゆえに毎回「venv とは・・・」みたいな気持ちになることもあります。

そこで試しに本記事で紹介する方法で一通りのコマンドを Docker 化してみたところ便利だったので、共有します。

全体としては以下がポイントです

  • aliasではなくシェルスクリプトを$PATHの通ったところに置く
  • uid, gid を引き継ぐ
  • 必要なディレクトリをもれなくマウントしておく
  • ホストとコンテナ上のパスの違いを吸収する
  • ユーザ、または非ユーザとして認証する場合の両方に対応する
  • 公式イメージがないものは docker build も自動実行するようにしておく

aliasを使わないのは、別のコマンド、シェルスクリプト内から読んだ場合にも動作させるためです。

また、 docker や今回ご紹介した方法に限った話ではないですが、場合によって重要な情報にアクセスできるような認証情報をコンテナに渡すことになるため、信頼できないソースからビルドしたイメージやコマンドを実行しないようにだけ気をつけてください。

この記事では aws, gcloud, おまけで cdk について紹介します。

この流れでなぜ terraform がないの?と思われるかもしれませんが、シングルバイナリで完結するツールなので、ホストを汚さないというメリットがない分、それほど意味がないと思ったため紹介していません。
とはいえ、インストール方法を統一できるという利点はありそうなので、興味がある方は試してみてください!

gcloud

PATH の通った適当な場所に以下のような内容で bash スクリプトを置いておきます

$HOME/bin/gcloud
#!/usr/bin/env bash

docker run \
  -u `id -u`:`id -g` \
  -v ${HOME}/.config/gcloud:/home/cloudsdk/.config/gcloud \
  -v $(pwd):$(pwd) \
  --workdir $(pwd) -it --rm \
  gcr.io/google.com/cloudsdktool/cloud-sdk:latest gcloud "${@}"
chmod +x $HOME/bin/gcloud

export PATH=$HOME/bin:$PATH

これで、ホスト上の python 環境を触らずに、ホスト上に直接 gcloud コマンドをインストールしたような使用感が得られます。

$ gcloud auth login
$ gcloud auth list
$ gcloud config set account $ACCOUNT
# ...

#
# Service Accountもローカル同様に利用できます
#

$ gcloud auth activate-service-account --key-file=$GOOGLE_APPLICATION_CREDENTIALS
$ gcloud auth list
# ...

dockergcloud を実行する手順はよく Qiita でも話題になっていますが、完全にホスト上にインストールしたのと同じ使用感のものは見当たらなかったり、サービスアカウントが前提になっているものが多かったので、「以前試したけどうまくいかなかった!」という方はこの方法を試してみていただくといいかもしれませんね。

awscli

awscli や AWS CDK のawscdk コマンドも同様に Docker 化しておくと、ホストを汚さずにすみ、バージョン管理も楽になったりするのでおすすめです。

aws コマンドの場合は以下のようにしておくと、 aws eks update-kubeconfig コマンドのように $HOME 以下 ($HOME/.kube/config)に書き込むようなコマンドにも対応できます。

$HOME/bin/aws
#!/usr/bin/env bash

docker run \
  -u `id -u`:`id -g` \
  -v ~/.aws:/aws \
  -v $(pwd):$(pwd) \
  --workdir $(pwd) --rm -it \
  -e AWS_CONFIG_FILE=/aws/config \
  -e AWS_SHARED_CREDENTIALS_FILE=/aws/credentials \
  -e AWS_DEFAULT_REGION \
  -e AWS_ACCESS_KEY_ID \
  -e AWS_SECRET_ACCESS_KEY \
  -e AWS_PROFILE \
  -e AWS_ROLE_ARN \
  -e AWS_WEB_IDENTITY_TOKEN_FILE \
  -e AWS_ROLE_SESSION_NAME \
  -e AWS_SESSION_TOKEN \
  -e KUBECONFIG=$(pwd)/aws/.kube/config \
  amazon/aws-cli:latest \
  "$@"

おまけ: cdk

AWS CDK の cdk コマンドのように、公式にはイメージが配布されていないようなものについては、 docker build のワンライナーを添えておくと、普段どおりコマンドを打つだけでビルドと実行が可能なので便利です。

$HOME/bin/cdk
#!/usr/bin/env bash

tempdir=$(mktemp -d) || exit 1

cat <<DOCKERFILE | docker build $tempdir -t cdk -f -
FROM node:14

RUN npm install -g aws-cdk

RUN apt-get update -y && apt-get install less -y

RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && \
    unzip awscliv2.zip && \
    ./aws/install

ENTRYPOINT [ "cdk" ]
DOCKERFILE

docker run \
  -u `id -u`:`id -g` \
  -v ~/.aws:/aws \
  -v $(pwd):$(pwd) \
  --workdir $(pwd) --rm -it \
  -e AWS_CONFIG_FILE=/aws/config \
  -e AWS_SHARED_CREDENTIALS_FILE=/aws/credentials \
  -e AWS_DEFAULT_REGION \
  -e AWS_ACCESS_KEY_ID \
  -e AWS_SECRET_ACCESS_KEY \
  -e AWS_PROFILE \
  -e AWS_ROLE_ARN \
  -e AWS_WEB_IDENTITY_TOKEN_FILE \
  -e AWS_ROLE_SESSION_NAME \
  -e AWS_SESSION_TOKEN cdk "$@"

cdk コマンドのようにカレントディレクトリ以下のファイルを読み書きするようなコマンドの場合、 -v $(pwd):$(pwd)-u オプションでカレントディレクトリ以下にカレントユーザと同じ uid, gid でアクセスできる点が効いてきます。

6
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?