AWS CloudShell で Docker が利用できるようになりました

記事タイトルとURLをコピーする

みなさん、こんにちは。AWS CLI が好きなテクニカルサポート課の市野です。

表題の通りですが、現地時間 2024年1月9日 の What's New with AWS? で AWS CloudShell で Docker の利用が開始されたという案内がありました。

クリックで目次が表示されます。

公式文書での発表

What's New with AWS?(英語版)

aws.amazon.com

Working with AWS CloudShell / Working with Docker

docs.aws.amazon.com

そもそも AWS CloudShell とは?

AWS Management Console に組み込まれたシェルで、適切な権限を持った IAM ユーザーが利用できるシェル環境となっています。
なお、2023年12月11日のアナウンスで、すべてのアカウントにおいて Amazon Linux 2023 ベースでの稼働に置き換えられています。

docs.aws.amazon.com

また、IAM ユーザーでのご利用には、IAM マネージドポリシー AWSCloudShellFullAccess の付与を行うか、最低限 cloudshell:CreateEnvironmentcloudshell:CreateSessioncloudshell:GetEnvironmentStatus、および、cloudshell:StartEnvironment のアクションの許可が必要となります。

AWS CloudShell のご利用に必要な IAM アクションの詳細は、以下公式ドキュメントをご参照ください。

docs.aws.amazon.com

あらためて、できるようになったこと

前述の What's New 記事を確認すると、すでに CloudShell 環境に Docker が組み込まれるようになっており、ユーザーによる任意の導入を必要とせずに、すぐに直接コンテナを作成できるようになっています。

また、What's New 記事内に記載されている公式ドキュメント Working with AWS CloudShell / Working with Docker によると、主なユースケースとして、Docker コンテナに基づく Lambda 関数の開発・デプロイや、Docker コンテナ構築から ECR リポジトリへのプッシュといった一連の作業をシームレスに行えることを想定しているようです。

合わせて、それぞれのユースケースに基づいたチュートリアルも用意されており、前述の公式ドキュメント内からもアクセスが可能となっております。(本エントリ執筆時点では英語版のみ)

用意されているチュートリアル

やってみた

上記のチュートリアルのうち後者に記載したリンク先の、CloudShell を利用した Docker コンテナのデプロイと ECR リポジトリへのプッシュをやってみました。
(多少既述を簡便にした程度とはいえ、チュートリアルの内容をほぼなぞっているだけではありますが…)

環境の確認

# OS の確認
$ cat /etc/os-release 
NAME="Amazon Linux"
VERSION="2023"
ID="amzn"
ID_LIKE="fedora"
VERSION_ID="2023"
PLATFORM_ID="platform:al2023"
PRETTY_NAME="Amazon Linux 2023"
ANSI_COLOR="0;33"
CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2023"
HOME_URL="https://aws.amazon.com/linux/"
BUG_REPORT_URL="https://github.com/amazonlinux/amazon-linux-2023"
SUPPORT_END="2028-03-01"

# Docker コマンドの確認
$ which docker
/usr/bin/docker

# Docker バージョンの確認
$ docker -v
Docker version 24.0.5, build ced0996

チュートリアルの実施

作業用ディレクトリの作成と移動、および Dockerfile の作成まで

# 作業用ディレクトリの作成と移動
$ mkdir ~/docker-cli-tutorial && cd $_

# Dockerfile の作成
cat << EOF > Dockerfile
# Dockerfile

# Base this container on the latest Amazon Linux version
FROM public.ecr.aws/amazonlinux/amazonlinux:latest

# Install the cowsay binary
RUN dnf install --assumeyes cowsay

# Default entrypoint binary
ENTRYPOINT [ "cowsay" ]

# Default argument for the cowsay entrypoint
CMD [ "Hello, World!" ]
EOF

コンテナの構築

タグを test-container として、コンテナを構築します。

$ docker build --tag test-container .
## 実行後、以下のように構築が行われます
[+] Building 26.1s (6/6) FINISHED                                                                                docker:default
 => [internal] load build definition from Dockerfile                                                                       0.1s
 => => transferring dockerfile: 403B                                                                                       0.0s
 => [internal] load .dockerignore                                                                                          0.0s
 => => transferring context: 2B                                                                                            0.0s
 => [internal] load metadata for public.ecr.aws/amazonlinux/amazonlinux:latest                                             1.6s
 => [1/2] FROM public.ecr.aws/amazonlinux/amazonlinux:latest@sha256:84d97b7b2d113de81cfd7f09754b931672ae9ed6ea4a6a9ca2f7d  7.3s
 => => resolve public.ecr.aws/amazonlinux/amazonlinux:latest@sha256:84d97b7b2d113de81cfd7f09754b931672ae9ed6ea4a6a9ca2f7d  0.0s
 => => sha256:7d6c88b8bc35118954bf6ad8678af824371b94eefe1f0f8545ae7ec103b001da 529B / 529B                                 0.0s
 => => sha256:91372915445bc997315287d6dbc8d6d0e5f6c86f15c64aa11d2b6dec77139c52 1.48kB / 1.48kB                             0.0s
 => => sha256:592fcbe9ebcec6e31ad10b3d219e4f61ce8e39180e215fab37ae75bc7ac4c0b7 52.24MB / 52.24MB                           1.5s
 => => sha256:84d97b7b2d113de81cfd7f09754b931672ae9ed6ea4a6a9ca2f7d95e53e9a777 770B / 770B                                 0.0s
 => => extracting sha256:592fcbe9ebcec6e31ad10b3d219e4f61ce8e39180e215fab37ae75bc7ac4c0b7                                  5.7s
 => [2/2] RUN dnf install --assumeyes cowsay                                                                              15.5s
 => exporting to image                                                                                                     1.4s 
 => => exporting layers                                                                                                    1.4s 
 => => writing image sha256:867736e9424fe74e59e67a2ca67c593b699b6676964af883cea3e637c2190cb1                               0.0s 
 => => naming to docker.io/library/test-container                                                                          0.0s 

新規コンテナでのコマンドの実行

$ docker container run test-container

## 実行後、以下のように cowsay によるアスキーアートが表示されます。
 _______________
< Hello, World! >
 ---------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

Amazon ECR リポジトリの作成

$ ECR_REPO_NAME=docker-tutorial-repo
$ aws ecr create-repository --repository-name ${ECR_REPO_NAME}

## 以下のように結果が返却されることを確認する
{
    "repository": {
    "repositoryArn": "arn:aws:ecr:ap-northeast-1:xxxxxxxxxxxx:repository/docker-tutorial-repo",
    "registryId": "xxxxxxxxxxxx"
    "repositoryName": "docker-tutorial-repo",
    "repositoryUri": "xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/docker-tutorial-repo",
    "createdAt": "2024-01-11T05:13:12+00:00",
    "ImageTagMutability": "MUTABLE",
    "imagesScanningConfiguration: {
        "scanOnPush": false
    },
    "encryptionConfiguration": {
        "encryptionType": "AES256"
    }
}

Docker 認証用 認証トークンの発行

$ AWS_ACCOUNT_ID=$( \
  aws sts get-caller-identity \
    --query "Account" \
    --output text)
$ ECR_URL=${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com
$ aws ecr get-login-password \
   | docker login --username AWS \
                  --password-stdin ${ECR_URL}

## 以下のように Login Succeeded と表示されることを確認する
WARNING! Your password will be stored unencrypted in /home/cloudshell-user/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

ECR リポジトリへのプッシュ

$ docker tag test-container ${ECR_URL}/${ECR_REPO_NAME}
$ docker push ${ECR_URL}/${ECR_REPO_NAME}
## docker push コマンド実行後、以下のように状況の表示がされることを確認する
Using default tag: latest
The push refers to repository [xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/docker-tutorial-repo]
0016bff2bdb7: Pushed 
fb81de341021: Pushed 
latest: digest: sha256:3ab7979b83b4d6f3a278e9803f0f2e4d18aecd714e5a52603f757069c4c652d4 size: 741

ECR リポジトリの確認(チュートリアル手順外)
$ aws ecr describe-repositories
## コマンド実行後、以下のように状況の表示がされることを確認する
{
    "repositories": [
        {
            "repositoryArn": "arn:aws:ecr:ap-northeast-1:xxxxxxxxxxxx:repository/docker-tutorial-repo",
            "registryId": "xxxxxxxxxxxx",
            "repositoryName": "docker-tutorial-repo",
            "repositoryUri": "xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/docker-tutorial-repo",
            "createdAt": "2024-01-11T05:13:12+00:00",
            "imageTagMutability": "MUTABLE",
            "imageScanningConfiguration": {
                "scanOnPush": false
            },
            "encryptionConfiguration": {
                "encryptionType": "AES256"
            }
        }
    ]
}

お片付け

# 作業用ディレクトリの削除
$ cd ~
$ rm -rf ~/docker-cli-tutorial

# ECR リポジトリの削除
$ aws ecr delete-repository --force --repository-name ${ECR_REPO_NAME}
## 以下のように結果が返却されることを確認する
{
    "repository": {
        "repositoryArn": "arn:aws:ecr:ap-northeast-1:xxxxxxxxxxxx:repository/docker-tutorial-repo",
        "registryId": "xxxxxxxxxxxx",
        "repositoryName": "docker-tutorial-repo",
        "repositoryUri": "xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/docker-tutorial-repo",
        "createdAt": "2024-01-11T05:13:12+00:00",
        "imageTagMutability": "MUTABLE"
    }
}

注意事項

AWS CloudShell で Docker を実行する際に、特に引っかかりやすい制限や制約として考えられる点は以下となるかと思われます。

  • 対応リージョンが限定されている
    詳細や最新情報は、適宜 公式ドキュメント をご参照ください。
  • AWS CloudShell の Persistent storage(永続ストレージ)が 1 GB までのため、これを超える大きさの Docker イメージや、ファイル過多となっている場合にディスク容量を超えているエラーの発生につながる可能性があります。

上記の永続ストレージの容量に限りがある点に加えて、リージョンごとの永続ストレージが一定期間(120日間) CloudShell セッションが発生していない場合に、ホームディレクトリが削除されてしまう点があります。
常用していない CloudShell 環境の場合どのような用途で利用しているかの判断がつきにくくなり、ホームディレクトリの自動削除により作業を行なった Dockerfile などのファイルが失われてしまう可能性がある点にもご留意が必要です。(ホームディレクトリの削除が行われる事前通知「Your AWS CloudShell data is scheduled for deletion on MM DD, YYYY [AWS Account: XXXXXXXXXXXX]」を受け取られた場合は、弊社 ガイド記事 もご参照ください。)

その他、AWS CloudShell でのトラブルシューティングや、Quota については以下公式ドキュメントをご参照ください。

AWS CloudShell のトラブルシューティングについて

docs.aws.amazon.com

AWS CloudShell の Quota について

docs.aws.amazon.com


従来、Docker コンテナの構築のために、EC2 インスタンスや Cloud9 環境などの事前準備をしていたような場合、用途によっては AWS CloudShell をご利用いただくことで、より迅速に開発やデプロイを行うことができるかと思います。

本記事がどなたかのお役に立てば幸いです。

ではまた。

市野 和明 (記事一覧)

マネージドサービス部・テクニカルサポート課

お客様から寄せられたご質問や技術検証を通じて得られた気づきを投稿していきます。

情シスだった前職までの経験で、UI がコロコロ変わる AWS においては GUI で手順を残していると画面構成が変わってしまって後々まごつくことが多かった経験から、極力変わりにくい AWS CLI での記事が多めです。