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を運用するのは厳しいでしょう。
これらの解決に向けての対策は別の機会に行っていきます。