LPI-Japanの学習環境構築ガイドに様々なLinuxサーバー構築方法が掲載されていますが、パブリッククラウドサービスを用いた学習環境構築方法については紹介こそあれ、具体的な解説が無いのでAWSサービスを使ってLinux学習環境を構築する方法をまとめてみました。LinuCを取得するなら、実機、仮想、クラウド、可能な限り試してみることをオススメします。
なお、本投稿は2022/2/13に実施したLPI-Japan 技術解説セミナーで紹介した内容を一部内容を変更追加し、再構成したものです。
セミナー動画を参考にしながら実際に手を動かしてみることでより学習効果が期待できるはずです。
目次
AWSの利用方法
Amazonが公式にアカウント作成ページを用意しており、5つのステップで簡単にアカウントを作成できます。
https://aws.amazon.com/jp/register-flow/
- AWSアカウントの作成
- 連絡先情報の入力
- 請求情報の入力
- SMSまたは音声電話による本人確認
- AWSサポートプランの選択
5ステップ全ての手続きを終えれば、数分ほどで登録メールアドレス宛に確認のメールが届き、「AWS マネジメントコンソールにお進みください」ボタンをクリックするとAWSの利用を開始できます。
ステップ3では有効なクレジットカードまたはデビットカード情報を入力する必要がありますが、AWS 無料利用枠内の利用に対し 料金は発生しません。5.では無料枠の利用でも有償のサポートを選択すると課金がスタートするので注意してください。
IAMユーザーを作成してAWSにサインイン
セキュリティの観点からも、登録ユーザーとは別のユーザーを作成し、そちらからサインインするようにしましょう。
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_users_create.html
AWSアカウントには1つ以上のIAM(AWS Identity and Access Management)ユーザーを作成できます。
IAMユーザーはマネジメントコンソールで作成できます。
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_users_sign-in.html
今回は一例として「linuxstudy」ユーザーを新規に作成します。
ユーザーには様々な権限を付与できますが、今回はあくまでテスト用ということで、契約関連以外の強い権限を持つ「AdministratorAccess」を付与します。
項目 | 内容 |
---|---|
ユーザー名 | linuxstudy |
AWS認証情報タイプ | パスワード – AWS マネジメントコンソールへのアクセス |
コンソールのパスワード | カスタムパスワード(値は任意) |
パスワードのリセットが必要 | 解除 |
アクセス権限 | 既存ポリシーで「AdministratorAccess」のみ |
タグ(キー) | Name |
タグ(値) | for Linux Study |
作成したIAMユーザーでAWSにサインインしなおします。
なお、AWSでは多要素認証 (MFA) の使用が推奨されています。rootユーザーだけでなく、IAMユーザーにも設定するようにしましょう。
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_mfa.html
EC2でLinux環境を構築する手順
学習用Linux環境構築にはAmazon EC2(以下EC2)を利用します。
EC2とは
EC2は、Elastic Compute Cloudの略称で、スケーラブルなコンピューティング環境を提供します。
ハードウェアに事前投資する必要がなくなり、アプリケーションをより速く開発およびデプロイできます。
必要に応じて仮想サーバーの起動、セキュリティおよびネットワーキングの構成、ストレージの管理ができます。
要件変更や需要増に応じてスケールアップまたはスケールダウンできるため、トラフィック予測の必要性を軽減できます。
インフラのみの提供になるアンマネージドサービス(IaaS)です。
EC2の機能
EC2を正しく利用するためには以下の機能の内容について把握しておく必要があります。
項目 | 内容 |
---|---|
インスタンス | 仮想コンピューティング環境(=仮想サーバー) |
AMI(Amazon Machine Image) | サーバー構築に必要なインスタンス用テンプレート |
インスタンスタイプ | インスタンス用の様々な構成(CPU、メモリ、ストレージなど) |
キーペア | インスタンス用の安全なログイン情報(認証鍵) |
インスタンスストアボリューム | インスタンスを停止、休止、または終了するときに削除される一時的ストレージボリューム |
EBSボリューム | データ用の永続的ストレージボリューム |
リージョンおよびアベイラビリティーゾーン | インスタンスやEBSボリュームなどのリソース用の複数の物理的な場所(データセンター) |
セキュリティグループ | インスタンスのプロトコル、ポート、ソース IP範囲を指定できる仮想ファイアウォール |
Elastic IP | 動的クラウドコンピューティング用の静的なIPv4アドレス |
タグ | EC2リソースに割り当てることができるメタデータ |
仮想プライベートクラウド(VPC) | AWS内で論理的に分離されたユーザー独自の仮想ネットワーク |
- リージョン:地理的な分類(世界26地域*に設置されたデータセンター群)
- アベイラビリティーゾーン(AZ):各リージョン内の複数の独立した場所
学習用のサーバー構築であれば、特に細かいことを気にする必要はありません。雛形となるAMIとインスタンスタイプの選定だけで驚くほど簡単にLinuxサーバーの構築が可能です。
EC2でLinuxインスタンスを開始する
事前準備として、AWSにIAMユーザーでログイン後、マネジメントコンソール からEC2サービスを選択しておきます。選択するリージョンによって価格が変わりますが、無料利用枠がある場合は速いレスポンスが期待できる日本国内の東京または大阪を選択しておくと良いと思います。
作成するインスタンスの構成
項目 | 設定内容 |
---|---|
AMI | Amazon Linux 2 |
インスタンスタイプ | t2.micro(仮想CPU数1、メモリ1GiB、無料利用枠) |
リージョン | 東京または大阪(お住まいの場所に近い方) |
インスタンス数 | 1 |
ネットワーク | デフォルト |
ストレージ | 8GB汎用SSD |
タグ | キー:Name、値:Linux Study |
セキュリティグループ | グループ名:lstudy-sg、説明:Linux Study、タイプ:SSH(22)、HTTP(80) |
構成図にすると以下のようになります。複雑そうに見えますが、東京リージョンの任意のAZにEC2のインスタンスを起動して、そのインスタンスに公開鍵暗号認証を使いSSH接続して操作する流れです。
EC2インスタンスを起動するまでのステップは以下の通り。
AMIはRedHat系のCentOS7互換でAmazonが独自に機能を拡張しているAmazon Linux 2を選択しますが、Debian系のAMIも多数用意されています。無料利用枠があるうちは色々試してみることをお勧めします。
インスタンスタイプですが、学習用途であれば無料利用期間内の対象となっているt2.microで十分です。
できるだけ手間を省いて学習環境を構築したいので、ネットワークとストレージはデフォルトのものを利用します。
今回は学習環境に可用性を持たせるわけではないので、サブネットは優先順位なしまたは自分の好きなAZを指定します。
自動割り当てパブリックIPは有効になっていればOKです。
そのほかは設定の必要はありません。
ストレージは表示されている内容そのままでOKです。
無料利用枠がなくなった場合、費用を抑えたいならボリュームタイプはgp3にしましょう。
タグは特に設定する必要はありませんが、学習環境であることがわかる内容にしておくと良いでしょう。
ここではキーがName、値をLinux Studyにしています。
セキュリティグループは、デフォルトでSSHだけが有効になっていますので、学習したい内容に合わせて設定します。今回はテストでWebアプリケーションを導入するのでHTTPを有効にしています。
確認と作成ボタンでここまで設定した内容が確認できます。
ステップ4で作成するキーペアは任意の名前で問題ありませんが、「aws-lstudy-key」のような用途がわかるような名前にすると他との区別がつきやすいかもしれません。また、ダウンロードできるタイミングが1回だけなので注意しましょう。またダウンロードしたキーファイルは認証に必要な秘密鍵なので大事に保管してください。
キーペアがダウンロードできたらインスタンスの作成ボタンをクリックします。
インスタンス作成後、ダッシュボードでインスタンスの状態が実行中でステータスチェックが終了していることが確認できればインスタンスへの接続が可能です。
EC2インスタンスにSSH接続する
EC2インスタンスへの接続手段はいくつかありますが、今回はSSHクライアントで接続します。
Macならターミナル、WindowsはTera TermやPowerShellなどを利用します。
EC2のインスタンス概要の「接続」ボタンをクリックして、SSHクライアントタブに切り替えましょう。ここで記載されている手順でSSH接続が可能です。
接続の前にchmodコマンドでダウンロード済みのプライベートキーファイルのパーミッションを変更しておきます。Windowsの場合は、キーファイルのプロパティにて所有者の読み込み権限のみ有効にしてください。
chmod 400 aws-lstudy-key.pem
パーミッション変更後、ec2-userユーザー名義でインスタンスにssh接続します。
sshコマンドに-iオプションを追加し、キーファイルの場所を指定して実行します・
$ ssh -i <キーファイル> ec2-user@<パブリックDNS or パブリックIP>
実際の実行例
$ ssh -i "aws-lstudy-key.pem" ec2-user@ec2-18-183-77-119.ap-northeast-1.compute.amazonaws.com
初回はホスト認証のセキュリティ警告が出るのでyesを選択してknown_hostsに登録。AmazonLinux 2 AMIの文字が出て、ターミナルのユーザーがec2-userに変わればログイン成功です。
% ssh -i "aws-lstudy-key.pem" ec2-user@ec2-13-114-163-64.ap-northeast-1.compute.amazonaws.com
The authenticity of host 'ec2-13-114-163-64.ap-northeast-1.compute.amazonaws.com (13.114.163.64)' can't be established.
ED25519 key fingerprint is SHA256:5wbTVrobiWoi0OxaFwT7MDVI7heBjosPo2pP5LjFGKs.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'ec2-13-114-163-64.ap-northeast-1.compute.amazonaws.com' (ED25519) to the list of known hosts.
Last login: Wed Feb 16 02:22:49 2022 from ec2-3-112-23-0.ap-northeast-1.compute.amazonaws.com __| __|_ ) _| ( / Amazon Linux 2 AMI ___|\___|___|
https://aws.amazon.com/amazon-linux-2/
3 package(s) needed for security, out of 6 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-172-31-15-59 ~]$
システム情報の確認
様々なコマンドを実行して、Amazon Linux 2のシステム情報などを確認しましょう。
[ec2-user@ip-172-31-15-59 ~]$ cat /etc/os-release
NAME="Amazon Linux"
VERSION="2"
ID="amzn"
ID_LIKE="centos rhel fedora"
VERSION_ID="2"
PRETTY_NAME="Amazon Linux 2"
ANSI_COLOR="0;33"
CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2"
HOME_URL="https://amazonlinux.com/"
[ec2-user@ip-172-31-15-59 ~]$ cat /proc/version
Linux version 5.10.96-90.460.amzn2.x86_64 (mockbuild@ip-10-0-54-229) (gcc10-gcc (GCC) 10.3.1 20210422 (Red Hat 10.3.1-1), GNU ld version 2.35-21.amzn2.0.1) #1 SMP Fri Feb 4 17:12:04 UTC 2022
[ec2-user@ip-172-31-15-59 ~]$ uname -a
Linux ip-172-31-15-59.ap-northeast-1.compute.internal 5.10.96-90.460.amzn2.x86_64 #1 SMP Fri Feb 4 17:12:04 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
[root@ip-172-31-15-59 ~]# locale
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=
[root@ip-172-31-15-59 ~]# timedatectl Local time: 水 2022-02-16 04:09:04 UTC Universal time: 水 2022-02-16 04:09:04 UTC RTC time: 水 2022-02-16 04:09:05 Time zone: n/a (UTC, +0000) NTP enabled: yes
NTP synchronized: yes RTC in local TZ: no DST active: n/a
EC2インスタンスに対してシステムアップデート、ソフトウェアのインストールや設定を行う
ログイン後、初めにシステムのアップデートを実施してシステムを最新にします。root権限が必要なので、sudoを頭につける。面倒な場合は一時的にrootユーザーに切り替えます。
一時的なrootユーザーへの切り替え
[ec2-user@ip-172-31-15-59 ~]$ sudo -i
[root@ip-172-31-15-59 ~]#
システムのアップデートを実行
[root@ip-172-31-15-59 ~]# yum update
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
amzn2-core | 3.7 kB 00:00:00
依存性の解決をしています
(中略)
依存性を解決しました
=========================================================================================================== Package アーキテクチャー バージョン リポジトリー 容量
===========================================================================================================
更新します: ca-certificates noarch 2021.2.50-72.amzn2.0.3 amzn2-core 372 k ec2-net-utils noarch 1.6-1.amzn2 amzn2-core 18 k ec2-utils noarch 1.2-46.amzn2 amzn2-core 12 k openssh x86_64 7.4p1-22.amzn2.0.1 amzn2-core 507 k openssh-clients x86_64 7.4p1-22.amzn2.0.1 amzn2-core 650 k openssh-server x86_64 7.4p1-22.amzn2.0.1 amzn2-core 456 k
トランザクションの要約
===========================================================================================================
更新 6 パッケージ
総ダウンロード容量: 2.0 M
Is this ok [y/d/N]: y
Downloading packages:
Delta RPMs disabled because /usr/bin/applydeltarpm not installed.
(1/6): ec2-net-utils-1.6-1.amzn2.noarch.rpm | 18 kB 00:00:00
(2/6): ec2-utils-1.2-46.amzn2.noarch.rpm | 12 kB 00:00:00
(3/6): ca-certificates-2021.2.50-72.amzn2.0.3.noarch.rpm | 372 kB 00:00:00
(4/6): openssh-clients-7.4p1-22.amzn2.0.1.x86_64.rpm | 650 kB 00:00:00
(5/6): openssh-7.4p1-22.amzn2.0.1.x86_64.rpm | 507 kB 00:00:00
(6/6): openssh-server-7.4p1-22.amzn2.0.1.x86_64.rpm | 456 kB 00:00:00
-----------------------------------------------------------------------------------------------------------------------------------
(中略) 12/12
更新: ca-certificates.noarch 0:2021.2.50-72.amzn2.0.3 ec2-net-utils.noarch 0:1.6-1.amzn2 ec2-utils.noarch 0:1.2-46.amzn2 openssh.x86_64 0:7.4p1-22.amzn2.0.1 openssh-clients.x86_64 0:7.4p1-22.amzn2.0.1 openssh-server.x86_64 0:7.4p1-22.amzn2.0.1
完了しました!
以上まででEC2上にLinuxサーバーの構築が完了したことになります。
あとは学習内容に応じて各種サーバーソフトウェアなどをインストール、実行、動作検証などを行えます。
以下はその一例です。
各種実行例
Webサーバーソフトのインストール、起動、動作状態の確認
[root@ip-172-31-15-59 ~]# yum install httpd
(省略)
[root@ip-172-31-15-59 ~]# systemctl start httpd
[root@ip-172-31-15-59 ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled) Active: active (running) since 水 2022-02-16 03:36:24 UTC; 5s ago Docs: man:httpd.service(8) Main PID: 484 (httpd) Status: "Processing requests..." CGroup: /system.slice/httpd.service ├─484 /usr/sbin/httpd -DFOREGROUND ├─485 /usr/sbin/httpd -DFOREGROUND ├─486 /usr/sbin/httpd -DFOREGROUND ├─487 /usr/sbin/httpd -DFOREGROUND ├─488 /usr/sbin/httpd -DFOREGROUND └─489 /usr/sbin/httpd -DFOREGROUND
(以下略)
Webサーバーの動作確認
curlコマンドでLocalhostを指定し、Apacheのテストページが取得できるか確認します。
[root@ip-172-31-15-59 ~]# curl localhost
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <title>Test Page for the Apache HTTP Server</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
(以下略)
また、ローカルマシンからWebブラウザでパブリックDNSまたはIPアドレスを指定してhttp接続します。ブラウザにApacheのTestページが表示されればOKです。
Dockerのインストールと起動
Redhat系の場合、通常は
# yum install -y yum-utils device-mapper-persistent-data lvm2
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# yum install -y docker-ce docker-ce-cli containerd.io
などの一連のコマンドで導入しますが、Amazon Linux 2にはDockerのリポジトリが含まれいてるので、yum install dockerだけでインストール可能です。
[root@ip-172-31-15-59 ~]# yum repolist
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
リポジトリー ID リポジトリー名 状態
!amzn2-core/2/x86_64 Amazon Linux 2 core repository 27,287
amzn2extra-docker/2/x86_64 Amazon Extras repo for docker 54
amzn2extra-kernel-5.10/2/x86_64 Amazon Extras repo for kernel-5.10 113
repolist: 27,454
[root@ip-172-31-15-59 ~]# yum install docker
(中略)
インストール: docker.x86_64 0:20.10.7-5.amzn2
依存性関連をインストールしました: containerd.x86_64 0:1.4.6-7.amzn2 libcgroup.x86_64 0:0.41-21.amzn2 pigz.x86_64 0:2.3.4-1.amzn2.0.1 runc.x86_64 0:1.0.0-2.amzn2
完了しました!
インストール後は、systemctlコマンドでDockerを実行し動作状態を確認した上で、サンプルコンテナを実行してみましょう。
Dockerの起動と動作確認
# systemctl start docker
# systemctl status docker
# docker version
サンプルコンテナの実行
定番のhello-worldコンテナを実行。
[root@ip-172-31-15-59 ~]# docker container run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:97a379f4f88575512824f3b352bc03cd75e239179eea0fecc38e597b2209f49a
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal.
To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/
For more examples and ideas, visit: https://docs.docker.com/get-started/
hello-worldコンテナが正しく実行された場合に表示される上記メッセージに含まれるubuntuコンテナのコマンドを実行し、コンテナのOS情報を取得した例。
[root@ip-172-31-15-59 ~]# docker run -it ubuntu bash
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
08c01a0ec47e: Pull complete
Digest: sha256:669e010b58baf5beb2836b253c1fd5768333f0d1dbcb834f7c07a4dc93f474be
Status: Downloaded newer image for ubuntu:latest
root@85a85c9788e4:/# cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.3 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.3 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
root@85a85c9788e4:/# exit
exit
[root@ip-172-31-15-59 ~]#
DockerでWebサーバーを動かす
コンテナ版のApacheを実装します。Amazon Linux 2インスタンスに直接インストールしたApacheと競合しないポート(8080番)を指定してバックグラウンド起動しています。
[root@ip-172-31-15-59 ~]# docker container run -d --name apa01 -p 8080:80 httpd
Unable to find image 'httpd:latest' locally
latest: Pulling from library/httpd
5eb5b503b376: Pull complete
a43a76ccc967: Pull complete
942bd346e7f7: Pull complete
cdb155854ae6: Pull complete
10c4d45228bf: Pull complete
Digest: sha256:5cc947a200524a822883dc6ce6456d852d7c5629ab177dfbf7e38c1b4a647705
Status: Downloaded newer image for httpd:latest
fb0fa4607680c90166c161d265512e0566899082d314c3b7d14778a4fae61ac8
この状態でWebブラウザでhttp://パブリックURL:8080にアクセスしても繋がらないので、EC2のセキュリティグループ設定でインバウンドルールにカスタムTCPポート8080をルールに追加して再度ブラウザで確認しましょう。It worksという文字が表示されれば動作確認はOKです。
セキュリティ関連のログを確認
パブリッククラウドでサーバーを構築すると、まず間違いなく不正アクセスが行われます。セキュリティ的な観点からもセキュリティ関連のログを確認してそうした痕跡があるかどうか確認する癖をつけましょう。
less /var/log/secure
grep “Invalid user” /var/log/secure
実行例
[root@ip-172-31-15-59 ~]# grep 'Invalid user' /var/log/secure
Feb 16 03:07:16 ip-172-31-15-59 sshd[3931]: Invalid user admin from 5.188.62.248 port 58260
Feb 16 04:01:58 ip-172-31-15-59 sshd[920]: Invalid user user from 195.133.18.24 port 35944
Feb 16 04:02:09 ip-172-31-15-59 sshd[1036]: Invalid user admin from 5.188.62.248 port 40302
Feb 16 04:39:11 ip-172-31-15-59 sshd[1549]: Invalid user admin from 5.188.62.248 port 38548
不正アクセスがあまりにも頻繁に行われるようであれば、学習内容に応じてポートを開け閉めする、またポート番号を変更する、fail2banなどの不正アクセス防止ソフトを導入するなど、様々なセキュリティ対策の学びのきっかけにしましょう。
EC2インスタンスのクリーンアップ方法
不要になった環境はクリーンナップして削除しましょう。
EC2ダッシュボードからインスタンスを指定して「終了」を選択します。 停止ではなく終了することでインスタンスが削除できコストが発生しなくなります。
AWSアカウントを作成してから12か月間が経過しておらず、EC2の無料利用枠を使い切っていない場合、無料利用枠内で利用できるオプションを選択すると一切費用がかかりません。
AWS無料利用枠外でインスタンスを起動した場合は、インスタンスのステータスが休止または終了に変わるとインスタンスの課金が停止します。後のためにインスタンスを維持したいが料金を発生させたくない場合は、インスタンスを停止して後で再び開始できます。
なお、停止の場合はEC2の課金は止まりますが同時に作成されたEBSは課金対象になるので注意してください。
参考:
EC2インスタンスの料金
インスタンスの使用量+EBSの料金+通信料金+オプション料金
- インスタンスの使用量:稼働時間×単価
- EBSの料金:容量×単価
- 通信料金:インスタンスからインターネットに向けた通信(アウトバウンド)に対してのみ発生
- オプション料金:Elastic IPやRoute53など
AWSのチュートリアルコンテンツ
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-tutorials.html
を参考にして、色々と試してみましょう。