

# AWS CLI に対して公式の Amazon ECR Public イメージまたは Docker イメージを実行する
<a name="getting-started-docker"></a>

このトピックでは、Amazon Elastic Container Registry Public (Amazon ECR Public) または Docker Hub の公式イメージを使用して Docker で AWS CLI バージョンの実行、バージョン管理、設定を行う方法について説明します。Docker の使用方法の詳細については、[Docker のドキュメント](https://docs.docker.com/)を参照してください。

公式イメージは、AWS が直接サポートおよび維持する分離、移植性、セキュリティを提供します。これにより、インストールを自分で管理しなくても、コンテナベースの環境で AWS CLI バージョン 2 を使用できるようになります。

**Topics**
+ [

## 前提条件
](#cliv2-docker-prereq)
+ [

## Amazon ECR Public と DockerHub のどちらを選択するか
](#cliv2-docker-versus)
+ [

## AWS CLI バージョン 2 の公式イメージを実行する
](#cliv2-docker-install)
+ [

## 公式イメージのインターフェイスと下位互換性に関する注意事項
](#cliv2-docker-install-notes)
+ [

## 特定のバージョンとタグの使用
](#cliv2-docker-upgrade)
+ [

## 最新の公式イメージに更新する
](#cliv2-docker-update)
+ [

## ホストファイル、認証情報、環境変数、構成を共有する
](#cliv2-docker-share-files)
+ [

## docker run コマンドの短縮
](#cliv2-docker-aliases)

## 前提条件
<a name="cliv2-docker-prereq"></a>

Docker がインストールされている必要があります。インストール手順については、[Docker のウェブサイト](https://docs.docker.com/install/)を参照してください。

Docker のインストールを確認するには、次のコマンドを実行し、出力があることを確認します。

```
$ docker --version
Docker version 19.03.1
```

## Amazon ECR Public と DockerHub のどちらを選択するか
<a name="cliv2-docker-versus"></a>

AWS CLI イメージには、Docker Hub ではなく、Amazon ECR Public を使用することをお勧めします。Docker Hubでは、一般消費者向けのレート制限が厳しくなっているため、スロットリングの問題が発生する可能性があります。さらに、Amazon ECR Public は、複数のリージョンにイメージをレプリケートして、高い可用性を実現し、リージョンの停止問題に対処します。

Docker Hub のレート制限の詳細については、*Docker* ウェブサイトの「[Understanding Docker Hub Rate Limiting (Docker Hub のレート制限とは)](https://www.docker.com/increase-rate-limits/)」を参照してください。

## AWS CLI バージョン 2 の公式イメージを実行する
<a name="cliv2-docker-install"></a>

 `docker run` コマンドを初めて使用すると、最新のイメージがコンピュータにダウンロードされます。それ以降の `docker run` コマンドの使用は、ローカルコピーから実行されます。

AWS CLI バージョン 2 Docker イメージを実行するには、`docker run` コマンドを使用します。

------
#### [ Amazon ECR Public ]

AWS CLI バージョン 2 の Amazon ECR Public の公式イメージは、Amazon ECR Public の [`aws-cli/aws-cli` リポジトリ](https://gallery.ecr.aws/aws-cli/aws-cli)でホストされます。

```
$ docker run --rm -it public.ecr.aws/aws-cli/aws-cli command
```

------
#### [ Docker Hub ]

AWS CLI バージョン 2 の Docker の公式イメージは、Docker Hub の `amazon/aws-cli` リポジトリでホストされます。

```
$ docker run --rm -it amazon/aws-cli command
```

------

コマンドの機能は次のとおりです。
+ `docker run --rm -it repository/name` — `aws` 実行可能ファイルと同等です。このコマンドを実行するたびに、Docker はダウンロードしたイメージのコンテナをスピンアップし、`aws` コマンドを実行します。デフォルトで、イメージは AWS CLI バージョン 2 の最新バージョンを使用します。

  例えば、Docker で `aws --version` コマンドを呼び出すには、以下を実行します。

------
#### [ Amazon ECR Public ]

  ```
  $ docker run --rm -it public.ecr.aws/aws-cli/aws-cli --version
  aws-cli/2.27.41 Python/3.7.3 Linux/4.9.184-linuxkit botocore/2.4.5dev10
  ```

------
#### [ Docker Hub ]

  ```
  $ docker run --rm -it amazon/aws-cli --version
  aws-cli/2.27.41 Python/3.7.3 Linux/4.9.184-linuxkit botocore/2.4.5dev10
  ```

------
+ `--rm` - コマンドが終了後にコンテナをクリーンアップすることを指定します。
+ `-it` - で疑似 TTY をで開くように指定します。`stdin`これにより、コンテナで実行中でも、例えば `aws help` コマンドや `aws configure` コマンドを使用して、AWS CLI バージョン 2 に入力を提供できるようになります。`-it` を省略する場合は、以下の点を考慮してください。
  + スクリプトを実行している場合は、`-it` は不要です。
  + スクリプトでエラーが発生する場合は、Docker 呼び出しから `-it` を省略することで問題が解決する場合があります。
  + パイプ出力を実行しようとすると `-it` でエラーの原因となることがあり、Docker 呼び出しから `-it` を省略することで、この問題が解決する場合があります。`-it` フラグを保持したままパイプ出力を実行する場合は、デフォルトで使用されている[クライアント側のページャー](cli-usage-pagination.md#cli-usage-pagination-clientside) AWS CLI を無効にすることで問題が解決できます。

`docker run` コマンドの詳細については、[Docker reference guide](https://docs.docker.com/engine/reference/run/) を参照してください。

## 公式イメージのインターフェイスと下位互換性に関する注意事項
<a name="cliv2-docker-install-notes"></a>
+ イメージでサポートされる唯一のツールは AWS CLI です。必ず、`aws` 実行可能ファイルは直接実行する必要があります。例えば、`less` および `groff` がイメージに明示的にインストールされていても、AWS CLI コマンド以外では直接実行できません。
+ `/aws` 作業ディレクトリは、ユーザーによってコントロールします。AWS CLI コマンドを実行することでユーザーから指示されない限り、イメージはこのディレクトリに書き込まれません。
+ 最新のタグに依存する場合、下位互換性は保証されません。下位互換性を保証するには、特定の `<major.minor.patch>` タグに固定する必要があります。このタグはイミュータブルであり、1 回 のみプッシュされます。

## 特定のバージョンとタグの使用
<a name="cliv2-docker-upgrade"></a>

AWS CLI バージョン 2 の公式イメージには、使用できる複数のバージョン (`2.0.6` バージョン以降) があります。AWS CLI バージョン 2 の特定バージョンを実行するには、適切なタグを `docker run` コマンドに付加します。初めてタグを指定して `docker run` コマンドを使用すると、そのタグの最新のイメージがコンピュータにダウンロードされます。それ以降、そのタグで `docker run` コマンドを使用する場合は、ローカルコピーから実行されます。

次の 2 種類のタグを使用できます。
+ `latest` – イメージの AWS CLI バージョン 2 の最新バージョンを定義します。AWS CLI バージョン 2 の最新バージョンを使用する場合は、`latest` タグを使用することをお勧めします。ただし、このタグに依存する場合の下位互換性は保証されません。`latest` タグは、`docker run` コマンドでデフォルトで使用されます。`latest` タグを明示的に使用するには、タグをコンテナイメージ名に追加します。

------
#### [ Amazon ECR Public ]

  ```
  $ docker run --rm -it public.ecr.aws/aws-cli/aws-cli:latest command
  ```

------
#### [ Docker Hub ]

  ```
  $ docker run --rm -it amazon/aws-cli:latest command
  ```

------
+ `<major.minor.patch>` – イメージの AWS CLI バージョン 2 の特定バージョンを定義します。公式イメージを本番環境で使用する予定の場合は、下位互換性を確保するために、AWS CLI バージョン 2 の特定バージョンを使用することをお勧めします。例えば、バージョン `2.0.6` を実行するには、コンテナイメージ名にバージョンを追加します。

------
#### [ Amazon ECR Public ]

  ```
  $ docker run --rm -it public.ecr.aws/aws-cli/aws-cli:2.0.6 command
  ```

------
#### [ Docker Hub ]

  ```
  $ docker run --rm -it amazon/aws-cli:2.0.6 command
  ```

------

## 最新の公式イメージに更新する
<a name="cliv2-docker-update"></a>

最新のイメージは、`docker run` コマンドの初回使用時にのみコンピュータにダウンロードされるため、更新したイメージは手動でプルする必要があります。手動で最新バージョンに更新するには、`latest` タグ付きイメージをプルすることをお勧めします。イメージをプルすると、コンピュータに最新バージョンがダウンロードされます。

------
#### [ Amazon ECR Public ]

```
$ docker pull public.ecr.aws/aws-cli/aws-cli:latest
```

------
#### [ Docker Hub ]

```
$ docker pull amazon/aws-cli:latest
```

------

## ホストファイル、認証情報、環境変数、構成を共有する
<a name="cliv2-docker-share-files"></a>

AWS CLI バージョン 2 はコンテナで実行されるため、CLI はデフォルトでホストファイルシステムにアクセスできません。これには、設定と認証情報が含まれます。ホストファイルシステム、認証情報、および設定をコンテナと共有するには、ホストシステムの `~/.aws` ディレクトリを `/root/.aws` のコンテナにマウントして、`-v` コマンドに `docker run` フラグを付けます。これにより、コンテナで実行されている AWS CLI バージョン 2 がホストファイル情報を検索できるようになります。

------
#### [ Amazon ECR Public ]

**Linux および macOS**: 

```
$ docker run --rm -it -v ~/.aws:/root/.aws public.ecr.aws/aws-cli/aws-cli command
```

**Windows コマンドプロンプト**

```
$ docker run --rm -it -v %userprofile%\.aws:/root/.aws public.ecr.aws/aws-cli/aws-cli command
```

**Windows PowerShell**:

```
C:\> docker run --rm -it -v $env:userprofile\.aws:/root/.aws  public.ecr.aws/aws-cli/aws-cli command
```

------
#### [ Docker Hub ]

**Linux および macOS**: 

```
$ docker run --rm -it -v ~/.aws:/root/.aws amazon/aws-cli command
```

**Windows コマンドプロンプト**

```
$ docker run --rm -it -v %userprofile%\.aws:/root/.aws amazon/aws-cli command
```

**Windows PowerShell**:

```
C:\> docker run --rm -it -v $env:userprofile\.aws:/root/.aws  amazon/aws-cli command
```

------

`-v` フラグとマウントの詳細については、[Docker reference guide](https://docs.docker.com/storage/volumes/) を参照してください。

**注記**  
`config` および `credentials` の詳細については、「[Configuration and credential file settings in the AWS CLI](cli-configure-files.md)」を参照してください。

### 例 1: 認証情報と設定の提供
<a name="cliv2-docker-share-files-config"></a>

この例では、Amazon Simple Storage Service (Amazon S3) でバケットを一覧表示する `s3 ls` コマンドの実行時に、ホストの認証情報および設定を提供しています。以下の例では、AWS CLI 認証情報および設定ファイルのデフォルトの場所を使用しています。別の場所を使用するには、ファイルパスを変更します。

------
#### [ Amazon ECR Public ]

**Linux および macOS**: 

```
$ docker run --rm -it -v ~/.aws:/root/.aws public.ecr.aws/aws-cli/aws-cli s3 ls
2020-03-25 00:30:48 aws-cli-docker-demo
```

**Windows コマンドプロンプト**

```
$ docker run --rm -it -v %userprofile%\.aws:/root/.aws public.ecr.aws/aws-cli/aws-cli s3 ls
2020-03-25 00:30:48 aws-cli-docker-demo
```

**Windows PowerShell**:

```
C:\> docker run --rm -it -v $env:userprofile\.aws:/root/.aws public.ecr.aws/aws-cli/aws-cli s3 ls
```

------
#### [ Docker Hub ]

**Linux および macOS**: 

```
$ docker run --rm -it -v ~/.aws:/root/.aws amazon/aws-cli s3 ls
2020-03-25 00:30:48 aws-cli-docker-demo
```

**Windows コマンドプロンプト**

```
$ docker run --rm -it -v %userprofile%\.aws:/root/.aws amazon/aws-cli s3 ls
2020-03-25 00:30:48 aws-cli-docker-demo
```

**Windows PowerShell**:

```
C:\> docker run --rm -it -v $env:userprofile\.aws:/root/.aws amazon/aws-cli s3 ls
```

------

特定システムの環境変数は、`-e`フラグを使用して呼び出すことができます。環境変数を使用するには、変数を名前で呼び出します。

------
#### [ Amazon ECR Public ]

**Linux および macOS**: 

```
$ docker run --rm -it -v ~/.aws:/root/.aws -e ENVVAR_NAME public.ecr.aws/aws-cli/aws-cli s3 ls
2020-03-25 00:30:48 aws-cli-docker-demo
```

**Windows コマンドプロンプト**

```
$ docker run --rm -it -v %userprofile%\.aws:/root/.aws -e ENVVAR_NAME public.ecr.aws/aws-cli/aws-cli s3 ls
2020-03-25 00:30:48 aws-cli-docker-demo
```

**Windows PowerShell**:

```
C:\> docker run --rm -it -v $env:userprofile\.aws:/root/.aws -e ENVVAR_NAME public.ecr.aws/aws-cli/aws-cli s3 ls
```

------
#### [ Docker Hub ]

**Linux および macOS**: 

```
$ docker run --rm -it -v ~/.aws:/root/.aws -e ENVVAR_NAME amazon/aws-cli s3 ls
2020-03-25 00:30:48 aws-cli-docker-demo
```

**Windows コマンドプロンプト**

```
$ docker run --rm -it -v %userprofile%\.aws:/root/.aws -e ENVVAR_NAME amazon/aws-cli s3 ls
2020-03-25 00:30:48 aws-cli-docker-demo
```

**Windows PowerShell**:

```
C:\> docker run --rm -it -v $env:userprofile\.aws:/root/.aws -e ENVVAR_NAME amazon/aws-cli s3 ls
```

------

### 例 2: ホストシステムへの Amazon S3 ファイルのダウンロード
<a name="cliv2-docker-share-files-s3"></a>

一部の AWS CLI バージョン 2 コマンドでは、コンテナ内のホストシステムからファイルを読み取ったり、コンテナからホストシステムにファイルを書き込むことができます。

この例では、現在の作業ディレクトリをコンテナの `S3` ディレクトリにマウントして、`s3://aws-cli-docker-demo/hello` オブジェクト `/aws` をローカルファイルシステムにダウンロードします。`hello` オブジェクトをコンテナの `/aws` ディレクトリにダウンロードすると、ファイルはホストシステムの現在の作業ディレクトリにも保存されます。

------
#### [ Amazon ECR Public ]

**Linux および macOS**: 

```
$ docker run --rm -it -v ~/.aws:/root/.aws -v $(pwd):/aws public.ecr.aws/aws-cli/aws-cli s3 cp s3://aws-cli-docker-demo/hello .
download: s3://aws-cli-docker-demo/hello to ./hello
```

**Windows コマンドプロンプト**

```
$ docker run --rm -it -v %userprofile%\.aws:/root/.aws -v %cd%:/aws public.ecr.aws/aws-cli/aws-cli s3 cp s3://aws-cli-docker-demo/hello .
download: s3://aws-cli-docker-demo/hello to ./hello
```

**Windows PowerShell**:

```
C:\> docker run --rm -it -v $env:userprofile\.aws:/root/.aws -v $pwd\aws:/aws public.ecr.aws/aws-cli/aws-cli s3 cp s3://aws-cli-docker-demo/hello .
```

------
#### [ Docker Hub ]

**Linux および macOS**: 

```
$ docker run --rm -it -v ~/.aws:/root/.aws -v $(pwd):/aws amazon/aws-cli s3 cp s3://aws-cli-docker-demo/hello .
download: s3://aws-cli-docker-demo/hello to ./hello
```

**Windows コマンドプロンプト**

```
$ docker run --rm -it -v %userprofile%\.aws:/root/.aws -v %cd%:/aws amazon/aws-cli s3 cp s3://aws-cli-docker-demo/hello .
download: s3://aws-cli-docker-demo/hello to ./hello
```

**Windows PowerShell**:

```
C:\> docker run --rm -it -v $env:userprofile\.aws:/root/.aws -v $pwd\aws:/aws amazon/aws-cli s3 cp s3://aws-cli-docker-demo/hello .
```

------

ダウンロードしたファイルがローカルファイルシステムに存在することを確認するには、以下を実行します。

**Linux および macOS**: 

```
$ cat hello
Hello from Docker!
```

**Windows PowerShell**:

```
$ type hello
Hello from Docker!
```

### 例 3: AWS\$1PROFILE 環境変数の使用
<a name="cliv2-docker-share-files-envvars"></a>

特定システムの環境変数は、`-e`フラグを使用して呼び出すことができます。使用したいそれぞれの環境変数を呼び出してください。この例では、Amazon Simple Storage Service (Amazon S3) でバケットをリストする `s3 ls` コマンドの実行時に、ホスト認証情報、設定、および * AWS\$1PROFILE * 環境変数を提供しています。

------
#### [ Amazon ECR Public ]

**Linux および macOS**: 

```
$ docker run --rm -it -v ~/.aws:/root/.aws -e AWS_PROFILE public.ecr.aws/aws-cli/aws-cli s3 ls
2020-03-25 00:30:48 aws-cli-docker-demo
```

**Windows コマンドプロンプト**

```
$ docker run --rm -it -v %userprofile%\.aws:/root/.aws -e AWS_PROFILE public.ecr.aws/aws-cli/aws-cli s3 ls
2020-03-25 00:30:48 aws-cli-docker-demo
```

**Windows PowerShell**:

```
C:\> docker run --rm -it -v $env:userprofile\.aws:/root/.aws -e AWS_PROFILE public.ecr.aws/aws-cli/aws-cli s3 ls
```

------
#### [ Docker Hub ]

**Linux および macOS**: 

```
$ docker run --rm -it -v ~/.aws:/root/.aws -e AWS_PROFILE amazon/aws-cli s3 ls
2020-03-25 00:30:48 aws-cli-docker-demo
```

**Windows コマンドプロンプト**

```
$ docker run --rm -it -v %userprofile%\.aws:/root/.aws -e AWS_PROFILE amazon/aws-cli s3 ls
2020-03-25 00:30:48 aws-cli-docker-demo
```

**Windows PowerShell**:

```
C:\> docker run --rm -it -v $env:userprofile\.aws:/root/.aws -e AWS_PROFILE amazon/aws-cli s3 ls
```

------

## docker run コマンドの短縮
<a name="cliv2-docker-aliases"></a>

`docker run` コマンドを短縮するには、オペレーティングシステムの機能を使用して Linux および macOS で [https://www.linux.com/topic/desktop/understanding-linux-links/](https://www.linux.com/topic/desktop/understanding-linux-links/) (シンボリックリンク) または [https://www.linux.com/topic/desktop/aliases-diy-shell-commands/](https://www.linux.com/topic/desktop/aliases-diy-shell-commands/) を作成するか、あるいは Windows で [https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/doskey](https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/doskey) を作成することをお勧めします。`aws` エイリアスを設定するには、次のいずれかのコマンドを実行します。
+ `aws` コマンドへの基本的なアクセスについては、以下を実行します。

------
#### [ Amazon ECR Public ]

  **Linux および macOS**: 

  ```
  $ alias aws='docker run --rm -it public.ecr.aws/aws-cli/aws-cli'
  ```

  **Windows コマンドプロンプト**

  ```
  C:\> doskey aws=docker run --rm -it public.ecr.aws/aws-cli/aws-cli $*
  ```

  **Windows PowerShell**:

  ```
  C:\> Function AWSCLI {docker run --rm -it public.ecr.aws/aws-cli/aws-cli $args}
  Set-Alias -Name aws -Value AWSCLI
  ```

------
#### [ Docker Hub ]

  **Linux および macOS**: 

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

  **Windows コマンドプロンプト**

  ```
  C:\> doskey aws=docker run --rm -it amazon/aws-cli $*
  ```

  **Windows PowerShell**:

  ```
  C:\> Function AWSCLI {docker run --rm -it amazon/aws-cli $args}
  Set-Alias -Name aws -Value AWSCLI
  ```

------
+ `aws` コマンド使用時にホストファイルシステムおよび構成設定にアクセスする場合は、以下を実行します。

------
#### [ Amazon ECR Public ]

  **Linux および macOS**: 

  ```
  $ alias aws='docker run --rm -it -v ~/.aws:/root/.aws -v $(pwd):/aws public.ecr.aws/aws-cli/aws-cli'
  ```

  **Windows コマンドプロンプト**

  ```
  C:\> doskey aws=docker run --rm -it -v %userprofile%\.aws:/root/.aws -v %cd%:/aws public.ecr.aws/aws-cli/aws-cli $*
  ```

  **Windows PowerShell**:

  ```
  C:\> Function AWSCLI {docker run --rm -it -v $env:userprofile\.aws:/root/.aws -v $pwd\aws:/aws public.ecr.aws/aws-cli/aws-cli $args}
  Set-Alias -Name aws -Value AWSCLI
  ```

------
#### [ Docker Hub ]

  **Linux および macOS**: 

  ```
  $ alias aws='docker run --rm -it -v ~/.aws:/root/.aws -v $(pwd):/aws amazon/aws-cli'
  ```

  **Windows コマンドプロンプト**

  ```
  C:\> doskey aws=docker run --rm -it -v %userprofile%\.aws:/root/.aws -v %cd%:/aws amazon/aws-cli $*
  ```

  **Windows PowerShell**:

  ```
  C:\> Function AWSCLI {docker run --rm -it -v $env:userprofile\.aws:/root/.aws -v $pwd\aws:/aws amazon/aws-cli $args}
  Set-Alias -Name aws -Value AWSCLI
  ```

------
+ `aws` エイリアスで使用する特定のバージョンを割り当てるには、バージョンタグを追加します。

------
#### [ Amazon ECR Public ]

  **Linux および macOS**: 

  ```
  $ alias aws='docker run --rm -it -v ~/.aws:/root/.aws -v $(pwd):/aws public.ecr.aws/aws-cli/aws-cli:2.0.6'
  ```

  **Windows コマンドプロンプト**

  ```
  C:\> doskey aws=docker run --rm -it -v %userprofile%\.aws:/root/.aws -v %cd%:/aws public.ecr.aws/aws-cli/aws-cli:2.0.6 $*
  ```

  **Windows PowerShell**:

  ```
  C:\> Function AWSCLI {docker run --rm -it -v $env:userprofile\.aws:/root/.aws -v $pwd\aws:/aws public.ecr.aws/aws-cli/aws-cli:2.0.6 $args}
  Set-Alias -Name aws -Value AWSCLI
  ```

------
#### [ Docker Hub ]

  **Linux および macOS**: 

  ```
  $ alias aws='docker run --rm -it -v ~/.aws:/root/.aws -v $(pwd):/aws amazon/aws-cli:2.0.6'
  ```

  **Windows コマンドプロンプト**

  ```
  C:\> doskey aws=docker run --rm -it -v %userprofile%\.aws:/root/.aws -v %cd%:/aws amazon/aws-cli:2.0.6 $*
  ```

  **Windows PowerShell**:

  ```
  C:\> Function AWSCLI {docker run --rm -it -v $env:userprofile\.aws:/root/.aws -v $pwd\aws:/aws amazon/aws-cli:2.0.6 $args}
  Set-Alias -Name aws -Value AWSCLI
  ```

------

エイリアスの設定後、ホストシステムにインストールされている場合と同様に、コンテナから AWS CLI バージョン 2 を実行できます。

```
$ aws --version
aws-cli/2.27.41 Python/3.7.3 Linux/4.9.184-linuxkit botocore/2.4.5dev10
```