既に使っている方も多くいると思いますが、先月AWS CLI v2が正式リリースされました。このバージョンではバイナリが各メジャーなOS毎に用意されていて、Pythonのインストールが不要になったので、v1の頃より使いやすくなったかと思います。
それとは別につ先日の3月31日、公式からAWS CLI v2のDockerイメージの紹介がありました。ローカルではあまり使わないかもしれませんが、既にDockerを利用しているCI/CD環境でより簡単にAWS CLIが使えるようになったのではないでしょうか?
今回は、早速公式のAWS CLI v2のDockerイメージを使ってみたいと思います。
まずはversionを表示してみます:
$ docker run --rm -it amazon/aws-cli --version
Unable to find image 'amazon/aws-cli:latest' locally
(初回なのでイメージをPullしてます表示がされる...)
aws-cli/2.0.6 Python/3.7.3 Linux/4.19.76-linuxkit botocore/2.0.0dev10
表示されました。run
はENTRYPOINTなので aws
コマンドを指定する必要は無いみたいです。
Credentialを渡す
さて、認証をしないままでは何もできないので、実際のAWSアカウントのCredentialを渡してみましょう。
docker run
の -v
オプションでローカルの .aws ディレクトリをコンテナの /root/.aws
にマウントするだけです:
$ docker run --rm -it -v ~/.aws:/root/.aws amazon/aws-cli sts get-caller-identity
{
"UserId": "AIDAJ4I7WUG3DXXXXXXXX",
"Account": "XXX",
"Arn": "arn:aws:iam::XXX:user/issei"
}
無事get-caller-identityで認証者の情報が取得できました。
ちなみにこのマウントでは設定ファイルもマウントできて便利です。特定のprofileを使いたい時は --profile
オプションを使ってください。
ファイルをS3にアップロードする
S3にファイルをアップロードする場合にもマウントが必要です。
$ docker run --rm -it -v ~/.aws:/root/.aws -v $(pwd):/aws amazon/aws-cli s3 cp /aws/README.md s3://some-nice-bucket/
upload: ./README.md to s3://some-nice-bucket/README.md
その他:他のDockerネットワーク上のLocalStackをエンドポイントとする
例えば、DockerComposeとかを使って特定のコンテナスタックを作っており、その中で動いているLocalStackに対してCLIを叩きたいとします。
その場合は、docker run
のオプションでネットワークを指定すればOKです。
例えばdocker-compose.ymlのLocalStackが以下のような定義とします:
# ...
service:
# DynamoDBのモックをポート4569で動かしてる
localstack:
image: localstack/localstack
environment:
- SERVICES=dynamodb:4569
# ...
# ...
このスタックのネットワーク名を docker network
で探します:
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
xxxxxxxxxxxx test_stack_default bridge local
...
ネットワーク名が test_stack_default
である場合、これをそのまま --network
オプションに指定すればOKです:
docker run --rm -it -v ~/.aws:/root/.aws --network test_stack_default amazon/aws-cli --endpoint http://localstack:4569/ dynamodb list-tables
{
"TableNames": [
"some-nice-dynamodb-table"
]
}
以上、使い方の例のご紹介でした。恐らくローカルで使う機会はそんな無さそうですが、先述の通りCI/CD用途には良さそうです。