みなさん、こんにちは。AWS CLI が好きなテクニカルサポート課の市野です。
表題の通りですが、現地時間 2024年1月9日 の What's New with AWS? で AWS CloudShell で Docker の利用が開始されたという案内がありました。
クリックで目次が表示されます。
公式文書での発表
What's New with AWS?(英語版)
Working with AWS CloudShell / Working with Docker
そもそも AWS CloudShell とは?
AWS Management Console に組み込まれたシェルで、適切な権限を持った IAM ユーザーが利用できるシェル環境となっています。
なお、2023年12月11日のアナウンスで、すべてのアカウントにおいて Amazon Linux 2023 ベースでの稼働に置き換えられています。
また、IAM ユーザーでのご利用には、IAM マネージドポリシー AWSCloudShellFullAccess
の付与を行うか、最低限 cloudshell:CreateEnvironment
、cloudshell:CreateSession
、cloudshell:GetEnvironmentStatus
、および、cloudshell:StartEnvironment
のアクションの許可が必要となります。
AWS CloudShell のご利用に必要な IAM アクションの詳細は、以下公式ドキュメントをご参照ください。
あらためて、できるようになったこと
前述の What's New 記事を確認すると、すでに CloudShell 環境に Docker が組み込まれるようになっており、ユーザーによる任意の導入を必要とせずに、すぐに直接コンテナを作成できるようになっています。
また、What's New 記事内に記載されている公式ドキュメント Working with AWS CloudShell / Working with Docker によると、主なユースケースとして、Docker コンテナに基づく Lambda 関数の開発・デプロイや、Docker コンテナ構築から ECR リポジトリへのプッシュといった一連の作業をシームレスに行えることを想定しているようです。
合わせて、それぞれのユースケースに基づいたチュートリアルも用意されており、前述の公式ドキュメント内からもアクセスが可能となっております。(本エントリ執筆時点では英語版のみ)
用意されているチュートリアル
- Tutorial: Deploying a Lambda function using the AWS CDK
- Tutorial: Building a Docker container inside AWS CloudShell and pushing it to an Amazon ECR repository
やってみた
上記のチュートリアルのうち後者に記載したリンク先の、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 のトラブルシューティングについて
AWS CloudShell の Quota について
従来、Docker コンテナの構築のために、EC2 インスタンスや Cloud9 環境などの事前準備をしていたような場合、用途によっては AWS CloudShell をご利用いただくことで、より迅速に開発やデプロイを行うことができるかと思います。
本記事がどなたかのお役に立てば幸いです。
ではまた。
市野 和明 (記事一覧)
マネージドサービス部・テクニカルサポート課
お客様から寄せられたご質問や技術検証を通じて得られた気づきを投稿していきます。
情シスだった前職までの経験で、UI がコロコロ変わる AWS においては GUI で手順を残していると画面構成が変わってしまって後々まごつくことが多かった経験から、極力変わりにくい AWS CLI での記事が多めです。
X(Twitter):@kazzpapa3(AWS Community Builder)