AWS EC2でFedora CoreOS・Docker-Composeを動かす

公開日:2021年09月21日
最終更新日:2021年11月05日
レベル:★★★☆☆
AWS EC2にFedora CoreOSをインストールし、Docker-Composeを動かすまでをご紹介します。

ここでは、AWS EC2にFedoraCoreOSをインストールし、Docker-Composeを動かすまでをご紹介します。

なお、AWSの画面・設定手順は2021年9月時点のものです。今後変更される可能性が十分ありますのでご注意ください。

EC2インスタンスの作成

まずはAWSのアカウントを用意します。
AWSのアカウントを持っていない方は、AWSのサイトから「AWSアカウントを作成」をクリックして新規にアカウントを作成します。

次のようなページになるので、必要事項を入力して[続行(ステップ 1/5)]をクリックします。
ここから先の画面遷移はよく変わるので割愛します。

アカウントが作成できたら、EC2の管理ページ(EC2ダッシュボード)にアクセスします。

右上にある地域(リージョン)のプルダウンを開いて好みの地域を選択します。
EC2はリージョンによっても料金が変わりますので、最初にここで設定したほうが良いでしょう(無料使用枠の範囲内で使用する分にはどこでも良いでしょうが...)。

[インスタンスを起動]をクリックします。

Amazonマシンイメージ(AMI)を選択するページに変わるので、ここで「コミュニティAMI」を選択します。

左側ペインの「Fedora」にチェックを入れると、「fedora-coreos」が表示されるので、最新バージョンを探し、[選択]ボタンをクリックします。

ここで表示されるAMIの一覧は必ずしも最新の順で表示されていないようです。Fedora CoreOSの場合、Fedora CoreOSのサイトを参照し、最新のバージョンを確認して同じバージョンのものを探すようにしましょう。

「ストレージ」を設定します。
ストレージの詳細はおそらく非表示になっているので、「ストレージ」の▼マークをクリックして詳細を表示させ、「ストレージの編集」リンクをクリックします。

ストレージの容量を設定します。
今回は無料枠範囲内の「30」(30GB)を設定し[確認と作成]をクリックします。

[起動]をクリックします。

下図のようなウィンドウが表示されるので、キーペアを作成します。
既存キーペアの選択」プルダウンをクリックし、「新しいキーペアの作成」を選択します。

キーペアのタイプは「RSA」のままで良いでしょう。
キーペア名に識別しやすい名前を入力し、[キーペアのダウンロード]をクリックします。
秘密鍵ファイルが「キーペア名.pem」の名前でダウンロードされます。SSHで接続する際に使用するので大切に保管しておきます

キーペアのダウンロードを実行すると[インスタンスの作成]ボタンが有効になるのでクリックします。

インスタンスが作成されるまで2〜3分程度かかるので待ちます。
[インスタンスの表示]をクリックして状況を確認します。

インスタンスが作成され起動すると、インスタンスの状態が「実行中」になり、パブリック IPv4 DNSが割り当てられます
インスタンス作成完了後すぐにこの名前でSSH接続することができます。

セキュリティの設定

EC2のインスタンス作成直後は外部からSSH接続のみ受け付ける状態になっています。
今回、EC2にDockerでWebサーバを構築するので、HTTP接続も許可するように設定を追加します。

作成したインスタンスの概要から「セキュリティ」タブをクリックし、セキュリティグループのリンク(作成直後は1個のみあるはず)をクリックします。

[Edit inbound rules]ボタンをクリックします。

[ルールを追加]ボタンをクリックします。

SSHの下に行が増えるので、タイプに「HTTP」を選択、ソースの入力欄をクリックして表示されたプルダウンから「0.0.0.0/0」(外部からすべて)を選択します。

[ルールを保存]ボタンをクリックします。

これでこのインスタンスは外部から「SSH」と「HTTP」のみ受け付けるようになりました。

永続公開IPアドレスの割り当て

EC2インスタンスは停止後に再起動すると、それまで割り当てられていた公開IPアドレス(パブリック IPv4)が変わってしまいます。これでは運用上面倒(再起動ごとにDNSのIPアドレス値を変更しないといけない)なので、公開IPアドレスを固定化してみます。
AWSには「Elastic IPアドレス」というものがあり、この仕組みを使うとEC2インスタンスの公開IPアドレスを固定的に割り当てることができます。
2021年9月時点では、Elastic IPアドレス1個まで、実行中のEC2インスタンスに関連付けられている状態であれば、Elastic IPアドレスに料金は発生しません

以下に、作成したEC2インスタンスにElastic IPアドレスを割り当てる方法をご紹介します。

EC2ダッシュボードの左側にある「Elastic IP」をクリックし「Elastic IPアドレスの割り当て」をクリックします。

既定値のままで[割り当て]ボタンをクリックします。

この Elastic IP アドレスを関連付ける」をクリックします。

インスタンス」入力欄をクリックすると、現在持っているEC2インスタンスが表示されるので選択します。

このElastic IPアドレスの関連付けを許可する」のチェックを入れ、[関連付ける]ボタンをクリックします。

左側ペインの「インスタンス」をクリックしてインスタンスの概要を確認すると、割り当てられたElastic IPアドレスが関連付られていることが確認できます

CoreOS基本設定

ここまでのAWS EC2の設定が終了したら、クライアントからSSHでEC2にログインして基本的な設定を行っていきます。

SSHログイン

先にダウンロードしたキーペアファイル(秘密鍵)を適当なフォルダに保存します。

また、保存したキーペアファイルのパーミッションを「600」に変更します(macOS, Linuxの場合)。
これを忘れるとSSHログインできませんので注意しましょう。

Windowsのコマンドプロンプト、macOSのターミナルを開きSSHでログインします。
ログインするEC2のアドレスは、関連付けたElastic IPアドレスを指定します。
ログイン時のユーザはFedora CoreOSのプリセットユーザ「core」を指定します。
以下はキーペアファイル名を「ec2.pem」とし「keys/」フォルダに保存し、EC2のElastic IPが「3.143.x.x」の場合の例です。

% ssh -i keys/ec2.pem core@3.143.x.x

初回接続時はknown hostsに登録するためのメッセージが表示されるので「yes」を回答します。

The authenticity of host '3.143.x.x' can't be established.
ECDSA key fingerprint is SHA256:VW/xdd9qHeL〜.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes <--- 入力

Warning: Permanently added '3.143.x.x' (ECDSA) to the list of known hosts.

正常に接続が完了すると下記のようなメッセージが表示されます。

Fedora CoreOS 34.20211016.3.0
Tracker: https://github.com/coreos/fedora-coreos-tracker
Discuss: https://discussion.fedoraproject.org/c/server/coreos/

[core@ip-172-31-36-154 ~]$

タイムゾーン変更

Fedora CoreOS(以降「CoreOS」と記します)のインストール直後はタイムゾーンが「UTC」になっています。このままだとログファイル等の日時がUTCで表示されてしまうので「JST」に変更します。

$ sudo timedatectl set-timezone Asia/Tokyo
$ timedatectl status
               Local time: Mon 2021-09-20 19:55:48 JST
           Universal time: Mon 2021-09-20 10:55:48 UTC
                 RTC time: Mon 2021-09-20 10:55:48
                Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no
$

必要なパッケージをインストール

zip, unzipをインストールします。

$ sudo rpm-ostree install zip unzip

後々SELinuxのコマンド「semanage」を使いたい場合、次のようにしてインストールします(必須ではありません)。

$ sudo rpm-ostree install policycoreutils-python-utils

インストール終了後、再起動を要求されるので再起動します。


Added:
  unzip-6.0-50.fc34.x86_64
  zip-3.0-28.fc34.x86_64
Changes queued for next boot. Run "systemctl reboot" to start a reboot

$ sudo systemctl reboot

パスワードなしのsudoをやめる(任意)

CoreOSインストール直後はcoreユーザのみ作成されておりsudoコマンドの実行が許可されています。またcoreユーザにパスワードが設定されていないのでパスワードなしでsudoコマンドが実行可能となっています。
これを、sudo実行時にパスワードを要求するように変更します。

coreユーザにパスワードを設定します。
※強固なパスワードを設定するのであれば、単に「passwd」でも可。

$ sudo passwd core
Changing password for user core.
New password: <---------- パスワードを入力
Retype new password: <--- 同じパスワードを再度入力
passwd: all authentication tokens updated successfully.

/etc/sudoers.d/coreos-sudo-group」ファイルの内容を変更します。

$ sudo vi /etc/sudoers.d/coreos-sudo-group

行をコメントアウトします。

# https://github.com/openshift/os/issues/96
#%sudo        ALL=(ALL)       NOPASSWD: ALL <-- 先頭に#をつけてコメントアウト

再起動し、coreユーザでsudoコマンドを実行した時にパスワードを要求することを確認します。

docker-composeを動かす

docker-composeのインストール

CoreOSインストール直後はdockerコマンド、podmanコマンドは使用できますが、docker-composeは入っていませんのでインストールします。

$ sudo rpm-ostree install docker-compose

一旦再起動します。

$ sudo systemctl reboot

確認します。

$ which docker-compose
/usr/bin/docker-compose

Docker用ユーザの作成

CoreOSインストール直後はcoreユーザからdockerコマンドを実行できません(coreユーザはdockerグループに属していません)。

[core@ip-172-31-28-27 ~]$ docker container ls
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json": dial unix /var/run/docker.sock: connect: permission denied

coreユーザをdockerグループに入れるか、sudoでdockerコマンドを実行することもできますが、ここではセキュリティ面を考慮してDockerを使うための専用をユーザを作成することにします。

$ sudo useradd -u 10000 dockerrun <----- Docker専用ユーザ「dockerrun」を作成
$ sudo passwd dockerrun
$ sudo usermod -aG docker dockerrun <--- dockerグループに入れる
$ id dockerrun
uid=10000(dockerrun) gid=10000(dockerrun) groups=10000(dockerrun),978(docker)

Dockerファイル類の配置

docker-compose.yml、DockerfileなどDockerを動作させるために必要なファイル類を作成し配置します。

CoreOSではSELinuxが有効になっていますので、どこのディレクトリにdocker関連ファイルを置いても動作するわけではありません。「container_var_lib_t」などDockerの動作を許可するコンテキストが付加されたディレクトリにdocker関連ファイルを配置するか、Docker関連ファイルを保存するディレクトリにDockerの動作を許可するコンテキストを追加する必要があります。
ここでは「/var/lib/containers」ディレクトリ以下にDocker関連ファイルを置くことにします。

$ sudo mkdir /var/lib/containers/test
$ sudo vi /var/lib/containers/test/docker-compose.yml <--- 内容は割愛
$ sudo vi /var/lib/containers/test/Dockerfile <----------- 内容は割愛

docker-composeを実行します。

[core@ip-172-31-28-27 ~]$ sudo su dockerrun
[sudo] password for core: <--------- coreユーザのパスワードを入力

[dockerrun@ip-172-31-28-27 core]$ cd /var/lib/containers/test <-- dockerrunユーザに変わった
[dockerrun@ip-172-31-28-27 test]$ docker-compose up -d --build
 :
[dockerrun@ip-172-31-28-27 test]$ docker-compose ps <------------ コンテナの起動を確認
 :

懸案事項

以上でDocker-Composeを動かすことができるようになりました。
ですが、次のような懸案・課題が残っています。

  • ストレージをバインドマウントさせる際のSELinux制限への対応
  • Dockerのセキュリティ設定
  • DockerでWebサーバを稼働させる際のコンテンツの管理方法(コンテンツ配置場所、更新方法、など)

これらを解決していかないと本番環境でDockerを運用するのは厳しいでしょう。
これらの解決に向けての対策は別の機会に行っていきます。

ー 以上 ー

 CMSを使ったホームページ制作
 VPS, AWS等クラウドシステム構築
等々のご依頼承っております

Contents