自分が作ったサービスを公開するときや、自動化したいタスクを寝ている間にも稼働させるときに必要なインフラ技術やサーバー知識の勉強のはじめ方について紹介します。
メモ
当コンテンツでは「インフラストラクチャ」を「インフラ」と略しています。
エンジニアに必須のインフラとサーバーの知識
現代のシステム開発界隈では、エンジニアは種別を問わずインフラとサーバーの知識をしっかりと身につける必要があります。
一昔前であれば、インフラエンジニアという職種の人が一貫してインフラを担当していました。しかし、DevOps(開発と運用が相互に作用する開発手法)やIaC(Infrastructure as Code)の流れもあり、アプリケーションエンジニアがインフラを管理する機会も増えました。
インフラの学習対象は、プロトコルの理解、ネットワーク設計、セキュリティなど、コンピュータネットワークの基礎から始まりさまざまなトピックが含まれます。
また、さまざまな種類のサーバーやその機能、ネットワーク内の他の要素との相互作用についても熟知している必要があります。
さらに、エンジニアはサーバー管理についても理解する必要があります。
これにはサーバーのセットアップ、メンテナンス、トラブルシューティングが含まれます。また、多くの企業が効率性と拡張性を求めて物理サーバーから仮想サーバーやクラウドサーバーに移行しているため、仮想化に関する知識も欠かせません。
さらに、必要なときにデータを保護・復元するために、サーバーのストレージ、バックアップ、障害復旧の概念も理解しておく必要があります。
また、サーバーはオペレーティングシステムの上で動作するため、オペレーティングシステムの基本を理解することが重要です。
深く踏み込んで学習する場合は、自動化とIaCの台頭によりAnsible、Terraform、Dockerなどのサーバーのセットアップとデプロイを自動化するツールを使いこなせるようになる必要があります。
これらのスキルを組み合わせることで、エンジニアはあらゆる組織でインフラやサーバーに関連するタスクを効果的に処理するための知識を身につけることができます。
インフラ/サーバーの種類一覧
あらゆるアプリケーションのバックボーンを形成するインフラとサーバーですが、その種類は多様で、それぞれに特徴があり、異なるニーズや要件に対応しています。
ここでは主な種類とその特徴を見ていきましょう。
共有サーバー
一般的なレンタルサーバーとしても知られています。
1つのサーバーを複数の契約者で共有して利用することで安価に提供しているサーバーです。
会社のホームページのホスティングや、手軽にWordPressを使いたいといった用途では重宝されます。
物理サーバー
物理サーバーは、伝統的なインフラでありオンプレミスに設置された物理的なハードウェアを使用します。
専用サーバー: 1つのテナント(サーバー上の店子の意)専用の物理サーバーです。専用サーバーは、堅牢な性能とセキュリティを提供しますが、多額の初期投資と継続的なメンテナンスが必要です。
ラックサーバー: ラックに搭載されるサーバーです。複数のサーバーを必要とするビジネスに最適で容易に拡張できます。
仮想サーバー
仮想化技術により1台の物理サーバー上で複数の仮想サーバーを動作させることができ、それぞれが独立したマシンとして機能します。
仮想プライベートサーバー(VPS): サーバー提供業者がサービスとして販売する仮想マシンです。VPSは共有ホスティングと比較して、より高いレベルの制御を提供します。
ハイパーバイザー: 仮想マシンを作成し、管理するソフトウェア、ファームウェア、またはハードウェアです。
クラウドサーバー
クラウドサーバーとは、インターネット上でアクセス可能な仮想環境のことです。柔軟性、拡張性、費用対効果に優れています。
IaaS(Infrastructure as a Service): 仮想マシンやブロックやファイルベースのストレージ、ファイアウォール、ロードバランサー、IPアドレスなどのインフラを提供
PaaS(Platform as a Service): 顧客がアプリケーションの開発、実行、管理するためのプラットフォームを提供するもの。アプリケーションの開発・起動に伴うインフラ構築・保守の複雑さを伴わない
ハイブリッドクラウド
ハイブリッドクラウドは、オンプレミス、プライベートクラウド、パブリッククラウドを組み合わせたものです。
オンプレミスとクラウドベースのサービスの両方の利点を活用することを可能にします。
インフラとサーバーの種類と特性を理解することで、コスト、パフォーマンス、拡張性、セキュリティなどの要素をバランスよく考慮し、特定のニーズに最適なソリューションを選択できます。
インフラ/サーバーを独学するロードマップ
基本から始める: コンピュータネットワーク、インターネットの仕組み、オペレーティングシステムの基本について理解することから始めましょう。これらの概念を説明するオンラインチュートリアル、書籍、MOOCsなどのリソースを探します。
ハードウェアを学ぶ: CPU、メモリ、ストレージ、ネットワークなど、さまざまな種類のサーバーとその構成要素について学びます。
オペレーティングシステムについて学ぶ: サーバー用オペレーティングシステムと通常のデスクトップ用オペレーティングシステムの違いについて学びましょう。サーバー環境で一般的に使用されているLinuxから始めます。インストール、設定、管理方法について学びます。
サーバーの役割について理解する: Webサーバー、データベースサーバー、アプリケーションサーバー、DNSサーバーなど、さまざまなサーバーの役割について学びます。仮想マシンや古いハードウェアを使用して、これらのサーバーを自分でセットアップします。
仮想化について学ぶ: 仮想化の概念とVirtualBoxのようなツールに慣れ親しんでください。仮想マシンの作成と管理方法について学びます。
クラウドプロバイダーを実際に使ってみる: AWS、Google Cloud、Azureなどのクラウドサービスプロバイダーを検討します。無料サービスを利用して、クラウドベースのインフラを実践し、理解しましょう。
ネットワークについて学ぶIPアドレス、DNS、VPN、ファイアウォール、ロードバランサーなど、ネットワークの概念について知識を深めます。また、これらのサービスの設定や構成も試してみましょう。
セキュリティについて学ぶ: ファイアウォール、侵入検知システム(IPS)、暗号化、HTTPSやSSHなどのセキュアプロトコルなど、サーバーとネットワークのセキュリティの基本を理解できます。
実際のプロジェクトで練習する: Webサイトやデータベースサーバーのセットアップなど、プロジェクトを構築して知識を応用しましょう。これにより、実践的な経験を積み、理解をより確かなものにできます。
独学で学べる?
インフラやサーバーについて独自に学ぶことは、可能であるだけでなく、非常にやりがいのあることです。
書籍やインターネットだけでなく、さまざまなオンラインプラットフォームが学習環境を用意しています。また、AWS、Google Cloud、Azureなどのクラウドサービスプロバイダーの無料ティアでは、多額の初期投資を必要とせずに実践的な経験を積むことができます。
さらにオープンソースのツールやプラットフォームで、実際にサーバーの管理・運営を体験できます。
しかし、インフラやサーバーの独学には、他の独学と同様に、規律ある構造的なアプローチが必要であることを忘れてはいけません。
明確な学習目標を設定し、体系的な学習経路をたどり、新しく習得したスキルを定期的に練習することが効果的な学習には欠かせません。
また、学習プロセスを急がないことも重要です。
各コンセプトを十分に理解した上で次のステップに進むことでしっかりとした基礎が身に付きます。
理論的な知識だけでなく実践的な経験も重要です。
プロジェクトを立ち上げ、自由に実験し、失敗から学び常に成長を目指してください。
ローカルPCで黒い画面を学ぶ
エンジニアのイメージとして一般的な、黒い画面(ターミナルやコマンドプロンプト)を使いこなすことがインフラ学習では重要です。
MacやUnix系システムでサーバーやインフラを管理する際に役立つ基本的なターミナルコマンドを紹介します。
ナビゲーションコマンド
# カレントディレクトリ(作業ディレクトリ)へのフルパスを表示します。
$ pwd
# カレントディレクトリにあるすべてのファイルとディレクトリを一覧表示します。
# 詳細なリストを表示するには `ls -l` を、隠しファイルを表示するには `ls -a` を使用します。
$ ls
# ディレクトリを変更します。
# 1つ上の階層に移動するには `cd ..` を、特定のディレクトリに移動するには `cd [ディレクトリパス]` を使用します。
$ cd ~/Documents
ファイル操作
# 新しいファイルを作成します。
$ touch test.tsx
# ファイルやディレクトリをコピーします。
$ cp original.txt copy_file.txt
# ファイルやディレクトリを移動したり、名前を変更したりします。
$ mv original.txt destination.txt
# ファイルを削除します。
# ディレクトリとその内容を削除するには,`rm -r [ディレクトリ名]`を使用します.
$ rm test.txt
テキストエディタ
# nanoテキストエディターでファイルを開きます。
# Unix系で利用できる他のテキストエディタには、`vi`や`emacs`があります。
$ nano
# ターミナルにファイルの内容を表示します。
$ cat test.txt
プロセス管理
# 現在実行中のプロセスに関する情報を表示します。
$ ps
# 現在実行中のプロセスに関する情報を表示します。
# CPU使用率、メモリ使用率、プロセスなど、リアルタイムのシステム概要情報を表示します。
$ top
# 指定されたプロセスID(pid)を持つプロセスを終了させます。
$ kill 9999
ネットワークコマンド
ファイルパーミッション
# ファイルのパーミッションを変更します。
# パーミッションは数値(例:755)または記号(例:u+x)で表すことができます。
$ chmod 755 test.txt
これらのコマンドは、Unixライクなターミナルで可能なことの表面をなぞったに過ぎませんがインフラとサーバー管理について学ぶ際に触ってみるのに適しています。
特定のコマンドについてより多くの情報が必要な場合はman [コマンド]
機能を使用すると使用方法が表示されます(ただし、基本的に英語です)。
Dockerで仮想環境を作って学ぶ
Dockerは、アプリケーションとその依存関係を標準化されたユニットにパッケージ化して開発・展開できるため、インフラやサーバー管理の初心者に最適なツールです。
ここではDockerの学習を開始する方法を紹介します。
Dockerインストール
まず、Dockerのインストールから始めます。
Docker DesktopはMacとWindowsで、Docker EngineはLinuxで利用可能です。
Dockerのイメージとコンテナを理解する
Dockerはイメージとコンテナを使用します。
イメージ(image)は、コード、ランタイム、ライブラリ、環境変数、設定ファイルなど、ソフトウェアの一部を実行するために必要なすべてを含む軽量でスタンドアロンな実行可能パッケージのことを指します。
コンテナ(container)は、イメージの実行時インスタンスであり、実行するための枠組みです。
Dockerコンテナを実行する
まず、簡単なDockerコンテナを実行することから始めます。ターミナルを開いて以下を実行します。
このコマンドは、Docker Hubからhello-world
イメージを取得し(ローカルシステムにまだ存在しない場合)、そのイメージから新しいコンテナを作成し、そのコンテナを実行しています。
Dockerfileを作成
Dockerfileは、イメージを組み立てるためにユーザーがコマンドラインで呼び出すことができるすべてのコマンドを含むテキスト文書です。
以下は、Node.jsアプリケーションのシンプルなDockerfileの例です。
FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 8080
CMD [ "node" , "app.js" ]
このDockerfileは、Node.jsのベースイメージから始まり(FROM
)、作業ディレクトリ(WORKDIR
)を設定しています。ファイルのコピーと依存関係をインストールし(COPY
、RUN
)、8080番ポートを開いた上でapp.jsファイルを実行します(EXPOSE
、CMD
)。
Dockerイメージの構築と実行
Dockerfileからイメージをビルドしそれを実行する例です。
docker build -t my-node-app .
docker run -p 8080 :8080 -d my-node-app
これは、my-node-app
という名前のイメージを構築し、コンテナのポート8080をホスト(今回の場合は自分のローカルPC)のポート8080にマッピングして実行します。
Docker Composeで複数コンテナ管理
Dockerに慣れてくると、複数のコンテナを含むアプリケーション(Webサーバやデータベースなど)を扱うようになることがあります。
Docker Composeは、複数のコンテナを含むDockerアプリケーションを定義して実行するためのツールです。
ここでは紹介しませんが、Dockerを使いこなす次のステップとして学習を検討してください。
VPSでWebサイトを公開してみる
注意
VPSを試すには料金が発生します。基本的にクレジットカードが必須になっているので、この手順を試す際にはご注意ください。
VPSを借りる
DigitalOcean、Vultr、AWS、Google Cloud、Azureなど、さまざまなサーバーのプロバイダーがあります。
それらを利用するにはクレジットカードを登録して実際に料金を支払ってVPSを借りる形になります。多くが従量課金のため、使っていない時間はサーバーを停止させたり、削除してしまうことでほとんど学習にコストはかかりません。
※しかし無料ではできないので悪しからず。
今回の例ではLinux VPSを使用すると仮定しましょう。
VPSにアクセスする
SSHでVPSにアクセスする必要があります。
例えば、LinuxやMacOSを使用している場合、ターミナルを使用してVPSにアクセスできます。
Windowsの場合
Windowsを使用している場合はPuTTYのようなツールを使用できます。
VPSのアップデート
アップグレードや新規インストールのために、あらかじめパッケージリストをアップデートするのは習慣付けておきましょう。
ここではUbuntuでそれを行う方法を説明します。
sudo apt-get update
sudo apt-get upgrade
Webサーバーをインストール
Webサイトのファイルを提供するためにWebサーバーが必要です。
オープンソースのWebサーバーとして人気のあるNginxをインストールできます。
sudo apt-get install nginx
Webサイトのファイルをアップロード
静的Webサイトのファイルをサーバーにアップロードする必要があります。
SFTP(SSH File Transfer Protocol)またはSCP(Secure Copy Protocol)を使用してファイルを転送できます。
Webサイトとして利用するファイルはデフォルトのNginxルートディレクトリに置く必要があり、通常は/var/www/html
または/usr/share/nginx/html
です。
SCPを使ってローカルマシンからサーバーにディレクトリ(例: my_website_directory
)をコピーする場合は、次のコマンドで実行できます。
ここではmy_website_directory
の中に<p>test.</p>
とだけ書かれたindex.html
ファイルを入れておきます。
scp -r my_website_directory root@VPSのIP:/var/www/html
my_website_directory
は必ず自身のローカルディレクトリのパスに置き換えてください。
Webサーバーを設定
NginxをあなたのWebサイトファイルの場所に指定します。
これはデフォルトのサーバーブロック設定ファイルを編集することによって行うことができます。
sudo nano /etc/nginx/sites-available/default
このファイルの中でrootディレクティブを見つけ、それがあなたのWebサイトのディレクトリを指していることを確認します。
/etc/nginx/sites-available/default
server {
listen 80 default_server ;
listen [::]:80 default_server ;
root /var/www/html/my_website_directory ;
index index.html ;
server_name _ ;
location / {
try_files $uri $uri / =404 ;
}
}
変更後、ファイルを保存して閉じます。sudo nginx -t
で構文エラーがないかをテストし、成功したらsudo systemctl reload nginx
でNginxをリロードして変更を適用します。
WebブラウザでWebサイトを開く
最後に、WebブラウザでVPSのIPアドレスを入力することでWebサイトを見ることができるようになります。画面にはindex.html
の内容であるtest.
が表示されるはずです。
これは静的なWebサイトをホストするための最もシンプルでわかりやすい方法です。
より発展すると、ドメイン、HTTPSのためのSSL証明書、CDNなどをセットアップできます。
Google Cloud Runでサービスを公開する
Cloud Runはサーバーレス環境でアプリケーションを実行できるGoogle Cloudのサービスです。
ここではCloud Runを使用してシンプルなコンテナ化されたアプリケーションをデプロイする簡単な例を紹介します。
注意
ここではGoogle Cloudに登録済であり、ローカルでgcloud
コマンドを利用できる前提で例を書いています。
アプリケーションを構築する
この例ではNode.jsを使用してシンプルなHello World
アプリケーションを作成しましょう。
以下の内容でapp.jsという名前のファイルを作成します。
app.js
const express = require ( 'express' ) ;
const app = express ( ) ;
const port = process . env . PORT || 8080 ;
app . get ( '/' , ( req , res ) => {
res . send ( 'Hello, World!' ) ;
} ) ;
app . listen ( port , ( ) => {
console . log ( ` Listening on port ${ port } ` ) ;
} ) ;
package.json
{
"name" : "hello-world" ,
"version" : "1.0.0" ,
"description" : "A simple Node.js app" ,
"main" : "app.js" ,
"scripts" : {
"start" : "node app.js"
} ,
"dependencies" : {
"express" : "^4.17.1"
}
}
次にnpm install
を実行して必要な依存関係をインストールします。
アプリケーションをコンテナ化する
Cloud Runはコンテナからアプリケーションをデプロイします。
Node.jsアプリケーションと同じディレクトリにDockerfile
を作成します。
Dockerfile
# Node.js 14を使う
FROM node:14
# appディレクトリを作る
WORKDIR /usr/src/app
# 依存関係のインストール
COPY package*.json ./
RUN npm install
# ソースコードのコピー
COPY . .
# 8080番ポートを開く
EXPOSE 8080
CMD [ "npm" , "start" ]
このDockerfile
はNode.js 14イメージから起動し、アプリケーションコードとその依存関係をコンテナにコピーして、アプリケーションを起動します。
Google Container Registryにプッシュ
Google Cloud SDKには、Dockerの機能を含むコマンドラインツールgcloudが含まれています。
以下のコマンドを実行してDockerイメージをビルドし、Google Container Registry(GCR)にプッシュしてください。
gcloud builds submit --tag gcr.io/PROJECT-ID/helloworld
PROJECT-ID
はGoogle CloudのプロジェクトIDに置き換えてください。
このコマンドはDockerfile
からDockerイメージをビルドし、そのイメージをGoogle Container Registryにプッシュします。
Cloud Runでアプリケーションをデプロイ
以下のコマンドを使用してアプリケーションをデプロイします。
gcloud run deploy --image gcr.io/PROJECT-ID/helloworld --platform managed
このコマンドは、指定されたイメージからCloud Run上に新しいサービスを作成します。
このステップでは、リージョン、サービス名(デフォルトでよいです)、認証されていない起動を許可するかどうかを選択するように入力を求められます。
デプロイ後、gcloudからURLが提供されるので、このURLをブラウザで開くとHello, World!
と表示されます。
ドメインとIP、DNSを理解する
今回、ハンズオン形式で構築したインフラを独自ドメインで利用する場合は、さらにドメイン、IP、そしてDNSを理解する必要があります。
これらの理解にはボリュームのあるコンテンツが必要なため、別のコンテンツで紹介します。
本コンテンツでは簡単に概要を説明します。
ドメインを理解する
ドメインとは、ユーザーをWebサイトに誘導する単語で構成された人間に優しいアドレスのことです。
トップレベルドメイン(TLD)、セカンドレベルドメイン、サブドメインなど構造が分かれています。
IPアドレスについて学ぶ
インターネットに接続されているすべての機器には固有のIPアドレスが割り当てられており、インターネット上で情報をルーティングするために使用されています。
パブリックIPアドレスとプライベートIPアドレスの違いや、IPv4アドレスとIPv6アドレスの違いについても学びましょう。
DNSを探求する
DNS(Domain Name System)は、インターネットの電話帳のような役割を果たしています。
DNSサーバーがどのように人に優しいドメインをIPアドレスに変換し、インターネット上でデータをやり取りしているのかを理解しましょう。
実践編
基本的なことを理解したら実際に実在するドメインを使って体験することをおすすめします。
ping
、nslookup
、dig
などのコマンドラインツールを使ってDNSサーバーに問い合わせ、インターネット上のデータがどのような経路をたどっているかを追ってみましょう。
さらに、DNSレコード(A、CNAME、MXなど)、ドメインレジストラ、ホスティングなどの概念を理解するために、個人Webサイト用のドメインを取得・設定して実験すると理解が深まります。
インフラ/サーバーの中級者を目指すには
インフラとサーバーの基本をしっかり理解した上で、さらに知識を深めるためにいくつかの方向性があります。
ネットワーク
サーバーやインフラに携わる人にとって、ネットワークをしっかり理解することは非常に重要です。
ネットワークプロトコル、ファイアウォール、VPN、ルーターとスイッチ、ネットワークセキュリティなどのトピックを学ぶ必要があります。
クラウドサービス
AWS、Azure、Google Cloudなどのサービスは、ITインフラの分野を席巻しています。
これらの環境でシステムを展開し管理する方法を学ぶことは、エンジニア市場において非常に求められているスキルです。
各プロバイダーは、コンピュートインスタンス、マネージドデータベース、ストレージオプション、さまざまなAIや機械学習ツールなど、異なるサービスや製品を提供しています。
コンテナとオーケストレーション
先に例を挙げたDockerのようなコンテナ化は、アプリケーションをデプロイするための一般的なアプローチです。
アプリケーションをコンテナ化するDockerを深掘りすることや、コンテナオーケストレーションのためのKubernetesについて学ぶことは価値があります。
Infrastructure as Code(IaC)
IaCは、物理的なハードウェア構成や対話型の構成ツールではなく、機械的に読み取り可能な定義ファイルを通じてコンピュータのデータセンターを管理し、プロビジョニングするプロセスです。
Terraform、Ansible、Chef、Puppet、AWS CloudFormationなどのツールがこの分野でよく使用されています。