AWS EC2でFedoraCoreOS・Docker-Composeを動かす

公開日:2021年09月21日
最終更新日:2021年09月21日
レベル:★★★☆☆
AWS EC2にFedoraCoreOSをインストールし、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」が表示されるので、最新バージョン(おそらく一番上にある)の[選択]ボタンをクリックします。

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

ストレージの容量を設定します。
今回は無料枠範囲内の「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.20210904.1.0

############################################################################
WARNING: This system is using cgroups v1. For increased reliability
it is strongly recommended to migrate this system and your workloads
to use cgroups v2. For instructions on how to adjust kernel arguments
to use cgroups v2, see:
https://docs.fedoraproject.org/en-US/fedora-coreos/kernel-args/

To disable this warning, use:
sudo systemctl disable coreos-check-cgroups.service
############################################################################

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等クラウドシステム構築
等々のご依頼承っております