将来を見据えたウェブ・アプリケーションの構築:The Codestのエキスパート・チームによる洞察
The Codestが、最先端技術を駆使してスケーラブルでインタラクティブなウェブアプリケーションを作成し、あらゆるプラットフォームでシームレスなユーザー体験を提供することにどのように秀でているかをご覧ください。The Codestの専門知識がどのようにデジタルトランスフォーメーションとビジネス...
このチュートリアルでは、Amazon Elastic Container Service(ECS)を使ってサンプルのRailsアプリをデプロイする方法を紹介したいと思います。
を実行して作成しよう。 rails new sample-rails-app
次に、基本的なコントローラアクションを生成する。 レール G コントローラ ようこそインデックス
を設定し、ルートパスへのルートを`root to: welcome#index "として設定します。
我々の目標は、このウェルカムページがECSを使って展開されるのを見ることだ。
アマゾンECR はコンテナ・レジストリだ。このレジストリを使用して、アプリのイメージを保存し、ECS上で実行できるようにする。
あなたのところへ AWSパネル探す 弾性コンテナ
レジストリ をクリックしてください。 スタート.下の画面が表示されます:
プライベートリポジトリを作成し sample-rails-app.
リポジトリはあるが、空だ。このリポジトリにアプリの画像を入れたいのです。これが次のステップだ。
# Gemfile.lock以降にGemfileが変更された場合にエラーを投げる
RUN bundle config --global frozen 1
作業ディレクトリ /app
COPYゲムファイル Gemfile.lock ./
バンドルインストールの実行
COPY .
CMD ["rails", "server", "-b", "0.0.0.0"] .
そしてイメージを構築し、ECRのリポジトリにプッシュしよう。
その前に、`rails assets:precompile`でアセットをプリコンパイルしましょう。
作成したリポジトリにアクセスします。画面上部に プッシュコマンドを見る ボタンをクリックしてください。
私の場合(Linux)、以下のAWSの指示で実行している:
aws ecr get-login-password --region eu-central-1 | docker login --username AWS --password-stdin 212516879399.dkr.ecr.eu-central-1.amazonaws.com
docker build -t sample-rails-app .
docker tag sample-rails-app:latest 212516879399.dkr.ecr.eu-central-1.amazonaws.com/sample-rails-app:latest
docker push 212516879399.dkr.ecr.eu-central-1.amazonaws.com/sample-rails-app:latest
ユーザーにこの操作が許可されていることを確認してください。私のユーザーには、AmazonElasticContainerRegistryPowerUserポリシーを追加しました:
{
"バージョン":"2012-10-17",
"ステートメント":[
{
"Sid":"VisualEditor0"、
"Effect":許可
"アクション":[
"ecr:GetRegistryPolicy"、
"ecr:DescribeRegistry"、
"ecr:GetAuthorizationToken"、
"ecr:DeleteRegistryPolicy"、
"ecr:PutRegistryPolicy"、
"ecr:PutReplicationConfiguration"
],
"リソース":"*"
},
{
"Sid":"VisualEditor1"、
"効果":許可
"アクション":"ecr:*"、
"リソース":"arn:aws:ecr:*:212516879399:repository/*"
}
]
}
Dockerイメージは準備できた。
外部からアプリケーション・ロード・バランサーにだけ接続できるようにしたい。ECSクラスタ内で稼働しているコンテナにはトラフィックを渡します。
こちらへ EC2サービス -> ロードバランシング -> ロードバランサークリック ロードバランサーの作成選択 アプリケーションロードバランサー をクリックし 作成 ボタンをクリックする。
その名前を サンプル-レール-アプリ-アルブデフォルトのVPCを使用し、そのすべてのサブネットを選択します。
残されたのは セキュリティ・グループ そして リスナーとルーティング セクションを参照されたい。
ロードバランサ用に新しいセキュリティグループを作成します。これはファイアウォールのように動作します。インバウンドとアウトバウンドのトラフィックのルールを設定します。インバウンドのhttpトラフィック(TCPポート80)を受け入れ、アウトバウンドのトラフィックをすべて許可します。
これを行うには、"新しいセキュリティ・グループを作成する" リンク
セクション "基本詳細"、名前と説明を設定し、デフォルトのVPCを残す。
私の場合 - 名前: "サンプル-レール-アプリ-アルブ-SG", description:"http://www."
インバウンドルールをTypeで追加する: HTTP とソース: どこでもIPv4.アウトバウンドルールはそのままにしておく。
クリック セキュリティグループの作成そして、アプリケーションロードバランサーを作成したタブに戻り、セキュリティグループを更新して、先ほど作成したものを追加し、デフォルトのものを削除します。
このセクションでは、ロードバランサにトラフィックを渡す先を定義します。残す リスナー プロトコル そして ポート をクリックします。ターゲット・グループを作る" リンク
名前を"サンプル-レール-アプリ-アルブ-TG".唯一の変更はポート番号です。これはRailsアプリ用のものなので、ポート3000に渡します。次のステップ (登録ターゲット) で、ターゲット・グループを作成する。
アプリケーションロードバランサーを作成したタブに戻り、ターゲットグループをリフレッシュして、先ほど作成したものを選択する。
アプリケーション・ロード・バランサーの準備ができたので、次はECSを使ってみよう。
クラスタ、タスク、タスクの定義、サービスなど、怖い用語がたくさん出てくる。もっと簡単に説明すると、クラスターはサーバー(EC2インスタンス)のグループだと考えてほしい。各インスタンスでタスクを実行するが、これはコンテナ群が一緒に実行されているに過ぎない。タスクの定義は、どのコンテナが特定のグループに入っていて、どのリソース(メモリ、CPU)を与えたいかを記述する。サービスはこれらのタスクを監視し、クラスタ内で常に適切な数の健全なタスクが実行されていることを確認する。
これを念頭に置いて、クラスターを作成しよう。
ECSのページで クラスター リンクと クラスタの作成 ボタンをクリックする。を選択する。EC2 + Linuxネットワーキング「ワン・アンド・クリック 次のステップ.
クラスタ名を"サンプル-レール-アプリ-クラスタ".EC2のインスタンスタイプを選択する。私はFree Tierプランで利用できるt2-microを選んだ。インスタンス数は1のままにしておく。
ネットワーク・セクションで、デフォルトのVPCを使用し、そのすべてのサブネットを選択する。createをクリックして少し待つと、新しいECS Clusterが作成された。
をクリックしてください。 タスクの定義 リンクの後 新しいタスク定義の作成 ボタンをクリックします。を選択する。 EC2 オプションをクリックして 次のステップ.これから実行するアプリは非常にシンプルなので、ここで必要なのはいくつかのオプションだけだ。
セット タスクの定義 という名前を "サンプルレールアプリ"に直行する。 コンテナの定義 セクションをクリックし容器の追加".コンテナの名前を"サンプルレールアプリ"のフォーマットで画像の場所を設定する。リポジトリ-url/image:tag".新しいブラウザのタブで、ECRにアクセスして画像URIをコピーする。私の場合は"212516879399.dkr.ecr.eu-central-1.amazonaws.com/sample-rails-app:latest".
メモリ制限を推奨の300-500MiBに設定する。さて、一番厄介なのはポートマッピングです。
我々のアプリは、ポート3000のコンテナ内で実行される。そのため、コンテナ・ポートには3000を指定する。ホスト・ポートには0を入力する。これは基本的にランダムなポートを選択することを意味する。幸いなことに、アプリケーション・ロード・バランサーはこのポート・マッピングを知っており、トラフィックを正しく誘導することができる。この1つのインスタンスで複数のタスクを実行することもできる。
環境変数を追加する RAILS_ENV に設定する。 生産.
をクリックする。 追加 をクリックしてコンテナ定義を追加し 作成 をクリックして、タスク定義のセットアップを終了します。
クラスタ、ロードバランサー、タスク定義ができた。あとは、これらのタスクをクラスター内でどうにか実行しなければならない。これがサービスの仕事だ。新しく作成したクラスタに行き サービス タブをクリックし 作成 ボタンをクリックする。
起動タイプをEC2に設定し、名前を"サンプル-レール-アプリ-サービス".タスク数を1に設定し 次のステップ.このページで、Application Load Balancer のラジオボタンを選択し、既存の IAM ロールを選択します。Container to load balance "セクションで、正しいコンテナ "sample-rails-app:0:3000 "を入力し、"Add to load balancer "をクリックします。
プロダクション・リスナー・ポート」には、80:HTTPを選択する。サンプル-レール-アプリ-アルブ-TG「をクリックする。 次のステップ.去る オートスケーリング をクリックします。 次のステップ そして クリエイト・サービス.
作成したクラスタのページで タスク タブには、1つのタスクが実行されているはずです。サービスが開始した。EC2のサービスページに行き、ロードバランサーをクリックして、アプリケーションロードバランサーの詳細を見る。そこにDNS名があるはずだ。それをコピーしてブラウザで開く。アプリが表示されるはずだ。残念ながら、"504 ゲートウェイのタイムアウト「エラー。
問題はクラスタのセキュリティグループにあります。そのインバウンドルールがロードバランサーからのトラフィックを許可していない。これを修正するには、EC2パネルに戻って セキュリティ・グループ のリンクをクリックします。クラスタ作成プロセスで作成された新しいグループがあります。グループ名は"EC2ContainerService-sample-rails-app-cluster".それをクリックし、インバウンドルールを編集します。VPCからのトラフィックを許可したいので、Amazon VPCパネルに行き、VPCのIPv4 CIDRを確認します。ルールタイプを"すべての交通"とソースに IPv4 CIDR を指定します。このルールを保存して、バランサーのDNS名をロードしてみてください。
願わくば、私と同じように見てほしい。
続きを読む