はじめに
流石にそろそろ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-cli
がaws
とイコールになります。
長いのでエイリアスを設定することで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をあえて使おうとしている人間が、まさかこんな当たり前すぎることでつまずくとは思わなかったでしょう。
このことは特に公式の手順にはなかったのですが、以下の記述があったことを思い出す。
私は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
[default]
aws_access_key_id=XXXXXXXXXXXX
aws_secret_access_key=XXXXXXXXXXXXXXXXXXXXXXXX
3.~/.aws/configにマウントするファイル作成
ファイルの構成はこちらを参考にしました。
設定ファイルと認証情報ファイルの設定
$ vi 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など出るかと思ったのでレスポンス無で虚をつかれる。
きちんとストリームが作成されていることを確認しました。
おわりに
つまずくところが初歩すぎてつらい。
あまりに初歩すぎてかさっと検索した限りでは見つけられませんでしたが、自己解決できてよかったです。
お疲れ様でした。