自分が作ったサービスを公開するときや、自動化したいタスクを寝ている間にも稼働させるときに必要なインフラ技術やサーバー知識の勉強のはじめ方について紹介します。
現代のシステム開発界隈では、エンジニアは種別を問わずインフラとサーバーの知識をしっかりと身につける必要があります。
一昔前であれば、インフラエンジニアという職種の人が一貫してインフラを担当していました。しかし、DevOps(開発と運用が相互に作用する開発手法)やIaC(Infrastructure as Code)の流れもあり、アプリケーションエンジニアがインフラを管理する機会も増えました。
インフラの学習対象は、プロトコルの理解、ネットワーク設計、セキュリティなど、コンピュータネットワークの基礎から始まりさまざまなトピックが含まれます。
また、さまざまな種類のサーバーやその機能、ネットワーク内の他の要素との相互作用についても熟知している必要があります。
さらに、エンジニアはサーバー管理についても理解する必要があります。
これにはサーバーのセットアップ、メンテナンス、トラブルシューティングが含まれます。また、多くの企業が効率性と拡張性を求めて物理サーバーから仮想サーバーやクラウドサーバーに移行しているため、仮想化に関する知識も欠かせません。
さらに、必要なときにデータを保護・復元するために、サーバーのストレージ、バックアップ、障害復旧の概念も理解しておく必要があります。
また、サーバーはオペレーティングシステムの上で動作するため、オペレーティングシステムの基本を理解することが重要です。
深く踏み込んで学習する場合は、自動化とIaCの台頭によりAnsible、Terraform、Dockerなどのサーバーのセットアップとデプロイを自動化するツールを使いこなせるようになる必要があります。
これらのスキルを組み合わせることで、エンジニアはあらゆる組織でインフラやサーバーに関連するタスクを効果的に処理するための知識を身につけることができます。
あらゆるアプリケーションのバックボーンを形成するインフラとサーバーですが、その種類は多様で、それぞれに特徴があり、異なるニーズや要件に対応しています。
ここでは主な種類とその特徴を見ていきましょう。
一般的なレンタルサーバーとしても知られています。
1つのサーバーを複数の契約者で共有して利用することで安価に提供しているサーバーです。
会社のホームページのホスティングや、手軽にWordPressを使いたいといった用途では重宝されます。
物理サーバーは、伝統的なインフラでありオンプレミスに設置された物理的なハードウェアを使用します。
仮想化技術により1台の物理サーバー上で複数の仮想サーバーを動作させることができ、それぞれが独立したマシンとして機能します。
クラウドサーバーとは、インターネット上でアクセス可能な仮想環境のことです。柔軟性、拡張性、費用対効果に優れています。
ハイブリッドクラウドは、オンプレミス、プライベートクラウド、パブリッククラウドを組み合わせたものです。
オンプレミスとクラウドベースのサービスの両方の利点を活用することを可能にします。
インフラとサーバーの種類と特性を理解することで、コスト、パフォーマンス、拡張性、セキュリティなどの要素をバランスよく考慮し、特定のニーズに最適なソリューションを選択できます。
インフラやサーバーについて独自に学ぶことは、可能であるだけでなく、非常にやりがいのあることです。
書籍やインターネットだけでなく、さまざまなオンラインプラットフォームが学習環境を用意しています。また、AWS、Google Cloud、Azureなどのクラウドサービスプロバイダーの無料ティアでは、多額の初期投資を必要とせずに実践的な経験を積むことができます。
さらにオープンソースのツールやプラットフォームで、実際にサーバーの管理・運営を体験できます。
しかし、インフラやサーバーの独学には、他の独学と同様に、規律ある構造的なアプローチが必要であることを忘れてはいけません。
明確な学習目標を設定し、体系的な学習経路をたどり、新しく習得したスキルを定期的に練習することが効果的な学習には欠かせません。
また、学習プロセスを急がないことも重要です。
各コンセプトを十分に理解した上で次のステップに進むことでしっかりとした基礎が身に付きます。
理論的な知識だけでなく実践的な経験も重要です。
プロジェクトを立ち上げ、自由に実験し、失敗から学び常に成長を目指してください。
エンジニアのイメージとして一般的な、黒い画面(ターミナルやコマンドプロンプト)を使いこなすことがインフラ学習では重要です。
MacやUnix系システムでサーバーやインフラを管理する際に役立つ基本的なターミナルコマンドを紹介します。
これらのコマンドは、Unixライクなターミナルで可能なことの表面をなぞったに過ぎませんがインフラとサーバー管理について学ぶ際に触ってみるのに適しています。
特定のコマンドについてより多くの情報が必要な場合はman [コマンド]
機能を使用すると使用方法が表示されます(ただし、基本的に英語です)。
Dockerは、アプリケーションとその依存関係を標準化されたユニットにパッケージ化して開発・展開できるため、インフラやサーバー管理の初心者に最適なツールです。
ここではDockerの学習を開始する方法を紹介します。
まず、Dockerのインストールから始めます。
Docker DesktopはMacとWindowsで、Docker EngineはLinuxで利用可能です。
UbuntuにDockerをインストールする
WindowsにDockerをインストールする
MacOSにDockerをインストールする
Dockerはイメージとコンテナを使用します。
イメージ(image)は、コード、ランタイム、ライブラリ、環境変数、設定ファイルなど、ソフトウェアの一部を実行するために必要なすべてを含む軽量でスタンドアロンな実行可能パッケージのことを指します。
コンテナ(container)は、イメージの実行時インスタンスであり、実行するための枠組みです。
まず、簡単なDockerコンテナを実行することから始めます。ターミナルを開いて以下を実行します。
このコマンドは、Docker Hubからhello-world
イメージを取得し(ローカルシステムにまだ存在しない場合)、そのイメージから新しいコンテナを作成し、そのコンテナを実行しています。
Dockerfileは、イメージを組み立てるためにユーザーがコマンドラインで呼び出すことができるすべてのコマンドを含むテキスト文書です。
以下は、Node.jsアプリケーションのシンプルなDockerfileの例です。
このDockerfileは、Node.jsのベースイメージから始まり(FROM
)、作業ディレクトリ(WORKDIR
)を設定しています。ファイルのコピーと依存関係をインストールし(COPY
、RUN
)、8080番ポートを開いた上でapp.jsファイルを実行します(EXPOSE
、CMD
)。
Dockerfileからイメージをビルドしそれを実行する例です。
これは、my-node-app
という名前のイメージを構築し、コンテナのポート8080をホスト(今回の場合は自分のローカルPC)のポート8080にマッピングして実行します。
Dockerに慣れてくると、複数のコンテナを含むアプリケーション(Webサーバやデータベースなど)を扱うようになることがあります。
Docker Composeは、複数のコンテナを含むDockerアプリケーションを定義して実行するためのツールです。
ここでは紹介しませんが、Dockerを使いこなす次のステップとして学習を検討してください。
DigitalOcean、Vultr、AWS、Google Cloud、Azureなど、さまざまなサーバーのプロバイダーがあります。
それらを利用するにはクレジットカードを登録して実際に料金を支払ってVPSを借りる形になります。多くが従量課金のため、使っていない時間はサーバーを停止させたり、削除してしまうことでほとんど学習にコストはかかりません。
※しかし無料ではできないので悪しからず。
今回の例ではLinux VPSを使用すると仮定しましょう。
SSHでVPSにアクセスする必要があります。
例えば、LinuxやMacOSを使用している場合、ターミナルを使用してVPSにアクセスできます。
アップグレードや新規インストールのために、あらかじめパッケージリストをアップデートするのは習慣付けておきましょう。
ここではUbuntuでそれを行う方法を説明します。
Webサイトのファイルを提供するためにWebサーバーが必要です。
オープンソースのWebサーバーとして人気のあるNginxをインストールできます。
静的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
ファイルを入れておきます。
my_website_directory
は必ず自身のローカルディレクトリのパスに置き換えてください。
NginxをあなたのWebサイトファイルの場所に指定します。
これはデフォルトのサーバーブロック設定ファイルを編集することによって行うことができます。
このファイルの中でrootディレクティブを見つけ、それがあなたのWebサイトのディレクトリを指していることを確認します。
変更後、ファイルを保存して閉じます。sudo nginx -t
で構文エラーがないかをテストし、成功したらsudo systemctl reload nginx
でNginxをリロードして変更を適用します。
最後に、WebブラウザでVPSのIPアドレスを入力することでWebサイトを見ることができるようになります。画面にはindex.html
の内容であるtest.
が表示されるはずです。
これは静的なWebサイトをホストするための最もシンプルでわかりやすい方法です。
より発展すると、ドメイン、HTTPSのためのSSL証明書、CDNなどをセットアップできます。
Cloud Runはサーバーレス環境でアプリケーションを実行できるGoogle Cloudのサービスです。
ここではCloud Runを使用してシンプルなコンテナ化されたアプリケーションをデプロイする簡単な例を紹介します。
この例ではNode.jsを使用してシンプルなHello World
アプリケーションを作成しましょう。
以下の内容でapp.jsという名前のファイルを作成します。
次にnpm install
を実行して必要な依存関係をインストールします。
Cloud Runはコンテナからアプリケーションをデプロイします。
Node.jsアプリケーションと同じディレクトリにDockerfile
を作成します。
このDockerfile
はNode.js 14イメージから起動し、アプリケーションコードとその依存関係をコンテナにコピーして、アプリケーションを起動します。
Google Cloud SDKには、Dockerの機能を含むコマンドラインツールgcloudが含まれています。
以下のコマンドを実行してDockerイメージをビルドし、Google Container Registry(GCR)にプッシュしてください。
PROJECT-ID
はGoogle CloudのプロジェクトIDに置き換えてください。
このコマンドはDockerfile
からDockerイメージをビルドし、そのイメージをGoogle Container Registryにプッシュします。
以下のコマンドを使用してアプリケーションをデプロイします。
このコマンドは、指定されたイメージからCloud Run上に新しいサービスを作成します。
このステップでは、リージョン、サービス名(デフォルトでよいです)、認証されていない起動を許可するかどうかを選択するように入力を求められます。
デプロイ後、gcloudからURLが提供されるので、このURLをブラウザで開くとHello, World!
と表示されます。
今回、ハンズオン形式で構築したインフラを独自ドメインで利用する場合は、さらにドメイン、IP、そしてDNSを理解する必要があります。
これらの理解にはボリュームのあるコンテンツが必要なため、別のコンテンツで紹介します。
本コンテンツでは簡単に概要を説明します。
ドメインとは、ユーザーをWebサイトに誘導する単語で構成された人間に優しいアドレスのことです。
トップレベルドメイン(TLD)、セカンドレベルドメイン、サブドメインなど構造が分かれています。
インターネットに接続されているすべての機器には固有のIPアドレスが割り当てられており、インターネット上で情報をルーティングするために使用されています。
パブリックIPアドレスとプライベートIPアドレスの違いや、IPv4アドレスとIPv6アドレスの違いについても学びましょう。
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について学ぶことは価値があります。
IaCは、物理的なハードウェア構成や対話型の構成ツールではなく、機械的に読み取り可能な定義ファイルを通じてコンピュータのデータセンターを管理し、プロビジョニングするプロセスです。
Terraform、Ansible、Chef、Puppet、AWS CloudFormationなどのツールがこの分野でよく使用されています。