雑記
 

AWS EC2 のAmazon Linux上でASP.NETをDockerで動かす

2020/2/1

この記事が対象とする製品・バージョン

  Azure × 対象外です。
  AWS 対象です。
  Visual Studio × 対象外です。

目次

1.概要

この記事ではASP.NET CoreのサンプルWebアプリケーションをAWS EC2 (Amazon Linux)上に構築したDockerで実行し、ブラウザーからアクセスします。

この記事ではASP.NET Coreのサンプルを使用しますが、Dockerを使っているため、PHPのサンプルでも、Javaのサンプルでも同じ要領で実行できます。

まっさらなAmazon Linuxを前提としており、ポートの開放やDockerのインストールについても説明します。

発展 発展学習  -  ASP.NET CoreのWebアプリケーションを最も簡単に稼動させられるのはAzure AppService

発展学習では意欲的な方のために現段階では特に理解する必要はない項目を解説します。

AWSやDockerというこだわりがなく、ASP.NET CoreのWebアプリケーションを稼動させることが目的の場合は、AzureのApp Serviceが最も簡単です。そのうえ、App Serivceには期間の制限がない無料プランもあるため、クリティカルではないWebアプリケーションを稼動させるにうってつけです。詳細は下記の記事に記載しています。

無料でAzureを使ってVB/C#のアプリを公開する方法

また、AWS EC2でDockerを使わずにASP.NET CoreのWebアプリケーションを稼動させることもできます。

 

前提

AWS EC2でAmazon Linuxのインスタンスが構築されていること。

まだの場合、構築方法はここにまとめておきました。

AWSで仮想マシン(EC2)を構築する方法

 

構築したてのまっさらなAmazon Linuxを前提としているので既に何かをインストールしていたり設定を変更していたりする場合は手順どおりに実行できないかもしれません。

 

2.手順

2-1.ポート 8000 を開放する

この手順ではポート 8000 を使ってHTTP通信します。

デフォルトではポート 8000 でEC2インスタンスと通信することはできませんので、セキュリティグループの設定を変更してアクセスできるようにします。

メモ メモ  -  ポート 8000 の開放は必須ではありません
HTTP通信できるポートがあれば何でも良く 8000 である必要はありません。通常のHTTP通信で使用されるポート 80 を使用することもできます。8000以外のポートを変更する場合、後で、実行するdocker runコマンド内のポートを指定している部分を変更する必要があります。よくわからない方は、手順どおりポート8000をつかっておくのが無難です。
※なお、2020年現在はHTTPSを使うことが標準です。HTTPでのWebアプリの公開は限定的なテストやお試し程度にしておくことをお奨めします。

 

そのために、AWSコンソールで対象のEC2を選択し、下側の説明欄にある、セキュリティグループの名前をクリックします。

※この画像では launch-wizard-2 という名前になっていますが、名前は異なっているかもしれません。

 

インバウンドタブを開くとデフォルトではTCPのポート22のみが許可されています。

「編集」をクリックします。

 

ルールの追加をクリックし、カスタム TCP のポート 8000 を指定し、「保存」をクリックします。

保存すると、IPv4とIPv6のそれぞれの設定が追加されるので、2つルールが追加されたように見えます。

メモ メモ  -  この作業の意味
この作業を行うと、世界中のユーザーがこのセキュリティグループを使っている仮想マシンのポート8000に接続できるようになる可能性があります。(少なくとも、デフォルトで設定のまま作成されているEC2インスタンスには接続できるようになります。)
この段階ではポート8000に接続されても何も稼動していないので何もできません。この後の手順で、ポート8000に接続するとサンプルのWebアプリケーションが動作するようになります。このサンプルは無害なので実行されても問題ありません。
しかし、将来、知らない人に実行されては困るようなWebアプリケーションを動作させる場合、この手順通りにやると世界中の人から実行されてしまうので注意してください。その場合はインバウンドルールのソース欄を使って、このポートに接続できるIPアドレスを限定するか、Webアプリケーションに認証機能を実装します。

 

2-2.EC2インスタンスにログイン

AWSコンソールで対象のインスタンスに接続します。

ブラウザーベースのSSH接続を利用するのが簡単ですが、その他の方法でも構いません。

→詳しい手順はこちら

仮想マシン(EC2インスタンス)にログインする。

 

2-3.Dockerインストール

下記コマンドを実行します。

sudo amazon-linux-extras install docker -y

 

メモ メモ  -  yum はエラー

私ははじめyumでdockerをインストールしようとしていたのですが、Requires: container-selinux >= 2.9 というエラーが表示され、うまくいかず、調べたところ、yumではなくamazon-linux-extrasを使って一発でインストールできるようになっていることがわかりました。

amazon-linux-extras install を使うとdockerの他にmono、php, ruby, go,httpdなどがインストールできるようです。

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/amazon-linux-ami-basics.html

 

2-4.Docker起動

下記コマンドを実行します。

sudo service docker start

 

2-5.ASP.NET Coreサンプルのイメージを取得する。

下記コマンドを実行します。

sudo docker pull mcr.microsoft.com/dotnet/core/samples:aspnetapp

 

2-6.コンテナ実行

下記コマンドを実行します。

sudo docker run -p 8000:80 mcr.microsoft.com/dotnet/core/samples:aspnetapp

 

これでASP.NETのサンプルWebアプリケーションが起動し、ブラウザーを使って世界中からアクセスできるようになります。

Webアプリケーションを終了させるには、Ctlr + C を押します。

※もちろん、EC2 インスタンスを停止させたり終了させた場合もWebアプリケーションにはアクセスできなくなります。

 

3.Webアプリケーションへのアクセス

AWSコンソールで対象のEC2インスタンスを選択し、パブリックDNSを確認します。

※私の仮想マシンのパブリックDNSを公開したくないので、この画像では一部を隠しています。

 

ブラウザーで次のようなURLにアクセスすることでWebアプリケーションが実行され、表示されます。

http://パブリックDNS:8000/

例:

http://ec2-xxxxxxxxxxxxxxxxxxxx.ap-northeast-1.compute.amazonaws.com:8000/

マイクロソフトはこのイメージを頻繁に更新しているようなので、画面はこれとは異なるものが表示されるかもしれません。