LoginSignup
3
1

More than 1 year has passed since last update.

aws-cliとdockerを使う際、認証情報のマウントを飛ばしてしまった件

Last updated at Posted at 2021-05-05

はじめに

流石にそろそろAWSコンソールではなく、aws-cliを使おうと思った時、dockerでやりたいと思い調べたら2020年にaws cliのdockerイメージが公開されていました。
公式にも日本語化されたインストール手順の対象にdockerがありましたので、試してみたところ、
少しつまずいたので記事にしました。

つまずいた手順

まず、つまずいた手順をそのまま記載します。
こちらに従って、進めていきます。

$ docker run --rm -it amazon/aws-cli --version
// imageがない場合は、pullされます
aws-cli/2.2.2 Python/3.8.8 Linux/4.19.121-linuxkit docker/x86_64.amzn.2 prompt/off

aliasの設定

docker imageを使う場合、docker run --rm -it amazon/aws-cliawsとイコールになります。
長いのでエイリアスを設定することでdockerを意識せずに使えるようになります。

$ alias aws='docker run --rm -it amazon/aws-cli'

// エイリアス設定前
$ aws --version
-bash: aws: command not found

// エイリアス設定後
$ aws --version
aws-cli/2.2.2 Python/3.8.8 Linux/4.19.121-linuxkit docker/x86_64.amzn.2 prompt/off

なお、時が経った時、macにawscliをインストールしたと勘違いする可能性があるため、実際にはawsから少し変えています。以後記事内ではこちらを使っていきます。

実際の設定
$ alias dockeraws='docker run --rm -it amazon/aws-cli'

認証情報の設定(つまずいた部分✳︎)

ここからアクセスキーとシークレットアクセスキーを取得(ない場合、忘れた場合は新規作成)し、AWSアカウントとの紐付けを行います。
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-quickstart.html

//aws configreの実行
$ dockeraws configure
AWS Access Key ID [None]: AKXXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Default region name [None]: ap-northeast-1
Default output format [None]: 

*この記事の通りに設定している方はいないと思いますが、この手順は意味がないので不要です。後述を参照してください。

何が起こったか

Amazon Kinesis DataStreamsのストリームを作成しようとしました。
あまり本筋とは関係ないですが、こちらを参考にして作ろうとしていました。
https://docs.aws.amazon.com/ja_jp/streams/latest/dev/fundamental-stream.html

ストリーム名は、my-sample、初期シャード数は1とします。

$ dockeraws kinesis create-stream --stream-name my-sample --shard-count 1
You must specify a region. You can also configure your region by running "aws configure".

なるほど・・・?
aws configureでリージョン指定していたが?と思いつつ一旦エラー解消のため素直にregionを指定します。

$ dockeraws kinesis create-stream --stream-name my-sample --shard-count 1 --region ap-northeast-1

Unable to locate credentials. You can configure credentials by running "aws configure".

仕方ないので、調べてみたら前手順で設定したはずの情報が確かにない。

$ dockeraws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key                <not set>             None    None
secret_key                <not set>             None    None
    region                <not set>             None    None

原因

よく考えれば当たり前なのですが、コンテナを常時起動しているわけではなくイメージを都度立ち上げているので、前手順の作業はその瞬間立ち上がっていたコンテナに設定されてすぐ破棄されています。

以下2行はそれぞれ別のコンテナに対して行われているので、当然前者のconfigureで入力した内容が後者のコマンド実行時に反映されるわけがありません。

$ dockeraws configure //コンテナ1
$ dockeraws configure list // コンテナ2

AWSもaws-cliとdockerをあえて使おうとしている人間が、まさかこんな当たり前すぎることでつまずくとは思わなかったでしょう。
このことは特に公式の手順にはなかったのですが、以下の記述があったことを思い出す。

スクリーンショット 2021-05-05 15.35.44.png

私はaws-cliを利用するのが初めてだったのでホスト側にawsの認証情報は存在していませんでした。
ですのでマウントする対象のファイルはなく、今から設定すれば良いという考えて飛ばしていました。

解消手順

自身のmacにaws-cliをインストールしたこともする予定もありませんが、コンテナのライフサイクル上、configureにより作成される認証ファイルはコンテナ実行都度読み込ませる必要があります。
読み込みされる対象のファイルを手でホスト側(自身のmac)に作っていきます。
(もし既にPCにaws-cliがインストールされている場合、aws configureを自分のPCコンソールで実行すればファイル作成されるのでこの手順は不要です)

1.マウントする場所を作る

私は、普段開発で使っているworkディレクトリ配下にdockeraws/.awsを作りました。

$ mkdir {任意の場所}/dockeraws
$ mkdir {任意の場所}/dockeraws/.aws
$ cd {任意の場所}/dockeraws/.aws

2.~/.aws/credentialsにマウントするファイル作成

ファイルの構成はこちらを参考にしました。
設定ファイルと認証情報ファイルの設定

$ vi credentials
credentials
[default]
aws_access_key_id=XXXXXXXXXXXX
aws_secret_access_key=XXXXXXXXXXXXXXXXXXXXXXXX

3.~/.aws/configにマウントするファイル作成

ファイルの構成はこちらを参考にしました。
設定ファイルと認証情報ファイルの設定

$ vi config
config
[default]
region=ap-northeast-1
output=json

4.aliasに設定

この段階で、読み込まれるか動作確認します。

$ docker run --rm -it -v {任意の場所}/dockeraws/.aws:/root/.aws amazon/aws-cli configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************2DLO shared-credentials-file
secret_key     ****************Re2n shared-credentials-file
    region           ap-northeast-1      config-file    ~/.aws/config

問題なさそうです。
しかし、aliasはマウント設定をふくまないコマンドのままのため未だこの結果となります。

$ dockeraws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key                <not set>             None    None
secret_key                <not set>             None    None
    region                <not set>             None    None

$ alias
alias dockeraws='docker run --rm -it amazon/aws-cli'

alias設定を変更します。

$ alias aws='docker run --rm -it -v {任意の場所}/dockeraws/.aws:/root/.aws amazon/aws-cli'

こちらでも触れていますが、私はawsにしてしまうと勘違いする恐れがあるのでエイリアス名をdockerawsにしています。

実際の設定
$ alias dockeraws='docker run --rm -it -v /Users/yukokanai/work/aws/dockeraws/.aws:/root/.aws amazon/aws-cli'

// 上記手順で上書きされますが、万が一aliasを消したい場合は、unalias {エイリアス名}
$ unalias dockeraws

5.動作確認
先ほどは、Noneだった認証情報が表示されるようになりました。

$ dockeraws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************2DLO shared-credentials-file
secret_key     ****************Re2n shared-credentials-file
    region           ap-northeast-1      config-file    ~/.aws/config

最後に、当初やりたかったコマンドを再実行します。

$ dockeraws kinesis create-stream --stream-name my-sample --shard-count 1
$ dockeraws kinesis list-streams
{
    "StreamNames": [
        "my-sample"
    ]
}

当初はこのコマンド実行するごとにエラーが出たのでてっきりsuccessなど出るかと思ったのでレスポンス無で虚をつかれる。
きちんとストリームが作成されていることを確認しました。

おわりに

つまずくところが初歩すぎてつらい。
あまりに初歩すぎてかさっと検索した限りでは見つけられませんでしたが、自己解決できてよかったです。
お疲れ様でした。

3
1
0

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
3
1