Amazon Web Services ブログ

初めてのサーバーレスコンテナを AWS に素早くデプロイ

この記事は Fast forward on your first serverless container deployment on AWS を翻訳したものです。

はじめに

モダナイゼーションとコンテナ技術は、最近のテクノロジー関連のニュースやレポート、カンファレンスでも話題になっています。コンテナは、オンプレミス、ローカル、およびハイブリッドのワークロードにおいて、モダンなコンピュートレイヤーとして主流になりつつあります。この記事では、コンテナのコンセプトをわかりやすい例で紹介し、AWS に初めてコンテナをデプロイするための軽量なツールセットを提供します。

あなたは技術的な初心者ですか?それとも技術領域以外のロールで仕事をしていますか?時間がある時にコーディングやハンズオンをしていますか?AWS でコンテナをデプロイしてみたいと思ったことはありませんか?もしあなたの答えが「はい」、もしくは「はい」、または「はい」であるならばグッドタイミングです!あなたは数分後には AWS上で最初のコンテナをデプロイして、ビルダーの経験を体験することができるでしょう。

検証してみたいアイデアやインスピレーションからすべてが始まります。この記事では、そのアイデアが世界でまだ見たことのない新しい Web アプリケーションであると仮定します。あなたはアプリケーションを構築しましたが、そのイノベーションを披露するための新しい場所を見つける必要があります。素晴らしい選択肢の 1 つは、AWS 上の完全にスケーラブルなサーバーレスコンテナ環境にデプロイすることです。

ここ数年のコンテナの進化を考えると、私たちのコンテナブログには、多くの参考文献やコンテナ技術に Deep Dive した記事が掲載されています。さらに多くのコンテナ関連記事を読むことができるように、この記事の最後に参考資料のセクションを追加しています。この記事では、AWS 上でコンテナ化されたインフラストラクチャをデプロイおよびアンデプロイするために、非常に必要な手順とコンセプトのみを紹介します。さっそく始めてみましょう!

使用する技術の紹介

使用する技術について簡単に紹介します。AWS 上で最初のコンテナをデプロイする前に、いくつかのことを前もって明確にしておかなければなりません。

コンテナ技術の詳細に入る前に、次の表を見てコンテナが適しているユースケースを学びましょう。

コンテナに関する情報、コンテナ関連サービス、ユースケース、カスタマーストーリーなどの詳細については AWS のコンテナページをご覧ください。

この記事では、AWS 上での初めてのサーバーレスコンテナのデプロイについて説明します。サーバーレスとは、より俊敏にアプリケーションを構築することができるサービスやプラクティス、戦略を表しており、イノベーションと変化への対応を迅速に行うことができます。ここでは、AWS Fargate を使用して、Amazon Elastic Container Service (Amazon ECS) 上でサーバーレスコンテナを実行します。AWS Fargate はサーバーやクラスターを管理することなく、コンテナを実行できるサービスです。アプリケーションのニーズに集中し、適切なコンピューティングオプション (CPU とメモリの組み合わせ) を選択して、コンテナを実行するだけです。クラスターの最適化やサーバーの管理に必要な様々な要件を考えずに、アプリケーションのアーキテクティングと開発に集中できるのがメリットです。

さて、最初のサーバーレスコンテナを AWS 上にデプロイする方法を明らかにしましょう。AWS 上で最初のサーバーレスコンテナを素早くデプロイするには AWS Copilot が最適です。AWS Copilot は、AWS 上でコンテナ化されたアプリケーションを素早く起動し、簡単に管理できるようにするコマンドラインインターフェイス (CLI) です。お客様が基盤となるインフラストラクチャの自動化について考える必要はありません。

チュートリアル

想定されるユースケースのリストで、コンテナがさまざまなアーキテクチャに使用できることを確認しました。ここではコンテナにパッケージ化された Web アプリケーションを、AWS 上にデプロイするシミュレーションを行います。

次の図は簡略化されたインフラストラクチャを示しています。

ここでは、コンテナのデプロイのためにどのようにこのアーキテクチャが構築されたのかを探りつつ、さまざまなコンポーネントを解き明かしていきましょう。

必要な前提条件は AWS アカウントだけです。AWS アカウントの中で AWS Cloud9 を使用します。AWS Cloud9 は統合開発環境 (IDE) で、ブラウザだけで、コードを書いたり、実行したり、デバッグしたりすることができます。AWS Cloud9 を使うことなく、ご自身の好みのテキストエディタと設定されたターミナルを備えたローカルマシンを使って、同じことを実現可能です。この記事では、多くのツールをローカルマシンにインストールする必要がないように、シンプルさを重視しています。

このリンクをクリックして、AWS マネジメントコンソールで直接 AWS Cloud9 のページに遷移できます。AWS コンソールにサインインした後、上部のナビゲーションバーで、AWS Cloud9 環境を作成する AWS リージョンを選択します。

AWS Cloud9 環境を作成します。

3 つのステップを実行すると、新しい AWS Cloud9 インスタンスを起動して作業する準備が整います。単に「first container on aws」のような名前を指定して「Next step」をクリックするだけです。2 番目のステップでは、デフォルトのまま「Next step」をクリックします。3 番目のステップで、これまでのステップで選択したものを確認します。内容を確認して「Create environment」をクリックします。

AWS 上に AWS Cloud9 環境が作成され、下部にターミナルウィンドウがあるウェブインターフェースが提供されます。

AWS Cloud9 を使うことのさらなる利点は、AWS CLI や Docker などのソフトウェアスタックがすでにインストールされていることです。

次に、作成した AWS Cloud9 インスタンスに、AWS インフラストラクチャをデプロイするために必要な適切な権限を与える必要がありますが、その前に以下のコマンドを実行して、小さなヘルパーユーティリティーをインストールします。

sudo yum install -y jq

それでは、このガイドに従って IAM ロールを作成し、ワークスペースにアタッチします。また、AWS Cloud9 ワークスペースの IAM 設定を更新します。このガイドではデプロイに必要なデフォルトの AWS リージョンを設定しています。これでインスタンスには必要な権限がすべて揃いました。このガイドの先のセクションにセキュリティについての詳細を知るためのリンクがあります。

AWS Cloud9 にインストールするツールは AWS Copilot だけです。開いているターミナルに以下のコマンドをコピー & ペーストするだけで、Copilot CLI がインストールされ、すぐに使用できるようになります。

sudo curl -Lo /usr/local/bin/copilot https://github.com/aws/copilot-cli/releases/latest/download/copilot-linux \
   && sudo chmod +x /usr/local/bin/copilot \
   && copilot --help

これで AWS 上のコンテナサービスを使って、イノベーションを実現するための準備が整いました。AWS Cloud9 環境で、ディレクトリとプロジェクトファイルを作成します。ここでは、「My first serverless container app on AWS」という見出しを表示するシンプルな HTML ファイル (index.html) を作成します。次のコマンドをコピー&ペーストします。

mkdir myApp && cd myApp && echo "<html><body><h1>My first serverless container app on AWS</h1><body></html>" > index.html

この最小限のサンプルは、この記事の目的である「初めてのコンテナを AWS 上にデプロイする」ことを目指すものです。アイデアや技術に応じて、HTML ファイルをソースコードなどに置き換えてください。

コンテナベースのデプロイには Dockerfile が必要です。この Dockerfile は単なるテキストファイルです。アプリケーション (ここでは index.html) をピックアップしてコンテナイメージ内の適切な場所に配置し、デプロイが可能になる非常に基本的な Dockerfile を作成します。

printf "FROM public.ecr.aws/nginx/nginx:1.19-alpine\nCOPY index.html /usr/share/nginx/html" > Dockerfile

それでは、Dockerfile をさっと見てみましょう。最初の行ではコンテナイメージを参照する必要があります。私たちはウェブアプリケーションを構築しており、ここでは一般に公開されている Docker イメージを使用します。

1: FROM public.ecr.aws/nginx/nginx:1.19-alpine 
2: COPY index.html /usr/share/nginx/html

1 行目では、基盤となるコンテナイメージを参照しています。ここでは、公開されている Amazon ECR コンテナレジストリで提供されている NGINX を Web サーバーとして使用します。コロンの後の部分は、使用するコンテナイメージのバージョンを表しています。アプリケーションを本番環境にデプロイしたいので、コンテナイメージのバージョンを指定します。最新 (:latest) バージョン指定はしません。2 行目で、コンテナイメージのビルドプロセス中に index.html ファイルをイメージの特定のフォルダにコピーするように Docker に指示しています。このフォルダは、デプロイ時に自動的に NGINX がピックアップします。

さて、いよいよ最初のコンテナを 1 つのコマンドで AWS にデプロイします。

copilot init --app myapp \
  --name myapp-service \
  --type 'Load Balanced Web Service' \
  --dockerfile './Dockerfile' \
  --port 80 \
  --deploy

おめでとうございます!数分後、AWS に最初のコンテナアプリケーションをデプロイしたことを示す画面が表示されます。あなたのアプリケーションにアクセスできる URL が表示され、クリックすることが可能です。

Web アプリケーションを実行している AWS Fargate 上のコンテナから、以下のような画面が提供されているのがわかります。

デプロイしたものを確認してみましょう。AWS マネジメントコンソールの CloudFormation にアクセスすると、作成されたすべてのリソースを確認できます。Copilot はデプロイを異なるスタックに分割します。これはデプロイの一部を調整して、変更をより早く再デプロイしたい場合に便利な形です。

1 つのスタックを選択すると、コンテナをデプロイした CloudFormation テンプレートを確認したり、デプロイされたすべてのリソースの概要を確認したりできます。

ぜひ時間をとって、デプロイされたさまざまなスタックや、Copilot CLI を使ってどれだけ時間を節約したかを見てください。たった 1 つのコマンドで、完全にスケーラブルでサーバーレスなコンテナベースのデプロイを作成しました。このようなクラウドのデプロイの弾力性を、どのように調整、活用できるのかを見てみましょう。次の手順は、アプリケーションにいくつかの変更を加えて、 1 つのコンテナだけでなく 2 つのコンテナをデプロイし、ロードバランサーにトラフィックを分散させる必要があると仮定しています。

この画像をダウンロードし、Cloud9 環境にアップロードします。

Cloud9 内で、ローカルイメージファイルをドラッグアンドドロップし、myapp ディレクトリの index.html の横に保存するだけです。(ファイル名は clouds.jpg で保存します)

Cloud9 内で、index.html ファイルをダブルクリックし、アップロードしたファイルを参照するように以下を追加します。

<img src=”clouds.jpg”>

index.html ファイルの中身は、以下のスクリーンショットのようになります。

次に、Dockerfile を更新して、アプリケーションが新しいファイルを認識できるようにします。Dockerfile を開き、次の行をファイルに追加します。

COPY clouds.jpg /usr/share/nginx/html

Dockerfile は 以下のように 3 行になっているはずです。

FROM public.ecr.aws/nginx/nginx:1.19-alpine
COPY index.html /usr/share/nginx/html
COPY clouds.jpg /usr/share/nginx/html

アプリケーションにコンテンツを追加しました。デプロイするコンテナの数を調整する必要がある場合、Cloud9 内の Copilot ディレクトリを開き manifest.yml ファイルを探します。このファイルは基本的に、アプリをデプロイするための CloudFormation スクリプトを生成するための Copilot エンジンの構成です。ここでは、‘count’を ‘1’ から ‘2’ に変更します。

これで、更新されたコードと追加された画像でコンテナイメージをビルドし、ローカルでビルドされたイメージを ECR にプッシュし、変更されたマニフェストファイルを CloudFormation に変換して、デプロイを更新することができるようになりました。

copilot deploy

しばらく待つと、新しいデプロイが実行され、ブラウザを更新して内容を確認することができます。

また、AWS マネジメントコンソールの Amazon ECS にアクセスすると、2 つのコンテナがデプロイされていることがわかります。

何らかの運用タスクで、(Amazon CloudWatch に保存されている) ログを見たい場合、以下のシンプルなコマンドを実行することで参照可能です。

copilot svc logs

2 つのコンテナを使った最終的なアーキテクチャは以下のようになります。

最後に、AWS に初めてデプロイしたコンテナをクリーンアップして削除したいと思います。

copilot app delete

アプリケーション全体とそのリソースを削除するための最終的な確認として ‘Y’ を入力する必要があります。

コンテナ関連のインフラストラクチャがすべて削除されました。チュートリアルを終了する場合は、Cloud9 環境も停止して削除することを忘れないようにしましょう。

参考資料

コンテナの旅をさらに続けるためのおすすめ資料を紹介します。

この他にも様々なリソースがありますが、まずは上記の 9 つのリソースから始めてみてはいかがでしょうか!?

まとめ

この記事では AWS に初めてコンテナをデプロイしました。またデプロイするだけではなく、AWS Copilot についても学びました。AWS Copilot は、クラウドのインフラストラクチャや自動化に手を掛けるのではなく、アイデアに集中するためのコマンドラインツールです。また、基本的なコンテナの概念を学び、一般的なコンテナ用語を理解しました。まだまだ探求すべきことはたくさんありますが、皆さんがビルダーの体験をして、自分のアイデアを AWS 上で実現してくれることを願っています。あなたのアイデアを、どのようにして私たちのプラットフォームに導入したかをぜひ教えてください。

コンテナの旅を続けましょう!Amazon ECS Workshop でさらに詳しく学ぶことができますのでぜひ御覧ください。

翻訳はソリューションアーキテクト加治が担当しました。原文はこちらです。