Amazon EC2 の初期導入を代行した。
2019年7月時点のAWS画面を用いて、クラウド初級者向けに実例を示して手順を説明する。
ここではアカウントの新規作成から始め、下図のような構成を1時間で構築してみる。
AWSアカウントの作成
何はともあれアカウントを作成しなければ始まらない。公式チュートリアルの AWSアカウント作成の流れ に沿って進めよう。
アカウント作成後は、下表チェックリストに従って速やかにセキュリティ対策を行うこと。
確認事項 | チェック |
---|---|
ルートアカウント(特権ユーザ)のMFA(多要素認証)を有効にしたか? | |
日常の操作にルートアカウントを使うことがないように、管理用のIAMユーザを作成したか? | |
アクセス許可の管理を容易にするため、IAMグループを作成したか? | |
強力なIAMパスワードポリシーを設定したか? | |
未使用のアクセスキーは削除されているか? | |
具体的な手順は@tmknomさんの記事、AWSアカウントを取得したら速攻でやっておくべき初期設定まとめに書かれているので参照して欲しい。 |
AWSマネジメントコンソールにログイン
ルートアカウントはもう使わないのでログアウトし、先ほど作成した管理者用IAMユーザでコンソールにログインしなおす。
経理部門用IAMユーザの作成
請求情報の確認のみができるIAMユーザを作成する。
経理担当者にこのIAMユーザを貸与することで、技術部門への照会を減らすことができるし、経理部門が誤ってサービスを停止してしまうこともない。
ポリシーの作成
IAMのメニュー [ポリシー] [ポリシーの作成] をクリックする。
AWSユーザーガイド【例8:アカウント設定へのアクセスは拒否し、その他の請求および使用状況の情報へのフルアクセスは許可する】のJSONテキストをコピペする。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"aws-portal:*Billing",
"aws-portal:*Usage",
"aws-portal:*PaymentMethods"
],
"Resource": "*"
},
{
"Effect": "Deny",
"Action": "aws-portal:*Account",
"Resource": "*"
}
]
}
グループの作成
IAMのメニュー [グループ] [新しいグループの作成] から任意の名前でグループを作成し、前項のポリシーをアタッチする。
ユーザーの作成
IAMのメニュー [ユーザー] [ユーザーを追加] から任意の名前でユーザーを作成し、前項のグループに追加する。
請求ダッシュボード
経理部門が見る請求ダッシュボード(オンデマンドインスタンス=従量課金)の例を示す。
請求書の画面では、EC2リソースごとに詳細な内訳を見ることができる。
PDF版請求書をメールで受け取ることもできる。
リザーブドインスタンス(固定料金)への切り替えは、リソースの分析後スペックが固まってからでも良いだろう。
インスタンスの作成
メニュー [EC2] を選択する。作成前に今のリージョンを確認しておこう。(今回は東京を選択する)
EC2のメニュー [インスタンス] [インスタンスの作成] をクリックする。
Amazonマシンイメージ(AMI)の選択
AMIには、AWSが提供するもの、ユーザーコミュニティが提供するもの、ソフトウェアベンダーが提供するもの(Marketplace)がある。
今回は、MarketplaceからUbuntu 18.04
を選択する。
インスタンスタイプの選択
ここではm5.large
を選択(1時間当たり約13円)。今あえて前世代のm4.large
を選択する理由も無いだろう。
Amazon EC2 インスタンスタイプ
インスタンスの詳細の設定
今回は何も考えずに、デフォルトで追加されたVPC(Virtual Private Cloud)をそのまま使う。
インスタンスを誤って削除しないように、**[削除保護の有効化]**をチェックしておくと安全だ。
なお、インスタンスを複数作成するときは、インスタンスの用途(例えば専用のDBサーバなど)に応じてプライベートサブネットを作ることがあるが、今回はインスタンス(Web/DBサーバ)がひとつしか無いので、そのままデフォルトのパブリックサブネットに置く。
ストレージの追加
IoT機器からセンサーのデータを受け取るため、パーティションを下表のように分割した。
デバイス | 容量 | マウント先 | 備考 |
---|---|---|---|
/dev/sda1 | 30GB | / | |
/dev/sdb | 100GB | /data | MongoDB(スキーマレスのNoSQL型データベース)で使うため、IOPS重視とする。 |
/dev/sdc | 500GB | /archive | ログやビッグデータなど大量データを保存するのに使うため、スループット重視とする。 |
IOPSとスループットの関係はバケツリレーに例えると分かり易い。往復回数がIOPS、水の総量がスループット、ゆえにバケツのサイズに影響する、と考えれば良い。 |
[新しいボリュームの追加] をクリックし、次のように入力。
Amazon EBS ボリュームの種類
Amazon EBS の料金
セキュリティグループの設定
VPCにデフォルトのセキュリティグループがあるので、設定を変更する。
要はファイアウォールのことだ。特に解説は不要だろう。
デフォルトでは、インバウンドはすべて拒否、アウトバウンドはすべて許可となっている。
VPC のセキュリティグループ
新しいキーペアの作成
インスタンス作成の最終工程である。
[キーペアのダウンロード]、[インスタンスの作成] の順にクリックすれば完了する。
もし、下のようなメッセージが出ても、暫くして再試行すれば問題ないので慌てずに。
IPアドレスを割り当てる
インスタンス作成時に自動付与されたパブリックIPアドレス(グローバルIPアドレス)は変化する場合があるので、固定化する。
EC2のメニュー [Elastic IP] [新しいアドレスの割り当て] をクリックする。
IPアドレスをインスタンスに関連付ける
割り当てされたIPアドレスを選択し、アクションメニューからインスタンスに関連付けよう。
リソースタイプにインスタンス、インスタンスにはインスタンスIDを指定する。
以上でコンソール側の操作は終わりだ。
なお、インターネットゲートウェイはデフォルトVPCに最初からアタッチされている。
Linuxの初期設定
インスタンス作成時にダウンロードしたキーペア(秘密鍵)を使い、サーバにログインする。
Ubuntuの場合、初期ユーザー名はec2-user
ではなくubuntu
になる。
パッケージ更新
sudo -i
apt -y update
apt -y upgrade
パーティション作成
lsblk
コマンドで、SSDやHDDなどのブロックデバイス一覧を表示する。
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 88.4M 1 loop /snap/core/7169
loop1 7:1 0 18M 1 loop /snap/amazon-ssm-agent/1335
nvme0n1 259:0 0 100G 0 disk
nvme2n1 259:1 0 500G 0 disk
nvme1n1 259:2 0 30G 0 disk
└─nvme1n1p1 259:3 0 30G 0 part /
Nitro世代(ニトロではなくナイトロと読むらしい)のインスタンスでは、NVMeデバイス名に名前が変わるので注意。
例えば /dev/sda1
が /dev/nvme1n1p1
という具合だ。
デバイス名が分かったらフォーマットし、マウントを試みる。
mkfs -t ext4 /dev/nvme0n1
mkdir /data
mount /dev/nvme0n1 /data
マウントに成功したらfstab
に登録しよう。
デバイス名は変わる可能性があるので、起動時のマウントはUUIDにすべきだ。
UUIDはmkfs
したときに表示される他、blkid
コマンドでも確認できる。
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /data ext4 defaults,nofail 0 2
日本語化
これはお好みで。
apt -y install language-pack-ja-base language-pack-ja ibus-mozc
localectl set-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja"
source /etc/default/locale
apt -y install manpages-ja manpages-ja-dev
timedatectl set-timezone Asia/Tokyo
開発者用アカウント作成
sudo権限付のアカウントとキーペアを作成する。
adduser user
gpasswd -a user sudo
su - user
ssh-keygen -t rsa
mv ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
キーペアのうち、秘密鍵となる ~/.ssh/id_rsa
を安全なルートで開発者に渡そう。
なお、パスワード無しで sudo させたい場合は、--disabled-password
を付けてadduser
し、
user ALL = NOPASSWD:ALL
のように追加すれば良い。
ホスト名の変更
EC2では、ホスト名の初期値がプライベートIPアドレス(例:ip-12-34-56-78
)になっている。
これがシェルプロンプトの一部に表示されるのだが、いくつも端末を立ち上げていると、ここはどこ?になるので変更する。
hostnamectl set-hostname ホスト名
バックアップの取得
サーバを開発部門へ引き渡す前に、バックアップ(スナップショット)を取得しておこう。
再びコンソールにログインする。
インスタンスの停止
停止は必須ではないが推奨されている。
アクションメニューの [インスタンスの状態] から [停止] をクリックする。
EC2では [停止(stopped)] と [終了(terminated)] は意味がまったく違うので気を付けよう。
スナップショットの作成
リソースタイプにインスタンスを選択し、対象インスタンスを選ぶだけでOKだ。
これでスナップショットからいつでも復元できるようになる。
復元のやり方は何パターンかあり、Qiitaにも関連記事は沢山あるので色々試してみて欲しい。
DNS登録
ネームサーバは自前で管理しているので、Route53 は使わない。
ゾーンファイルにAレコードを追加する。
$TTL 3600
$ORIGIN example.com.
@ IN SOA foo.example.com. (
2019071401 ; Serial
43200 ; Refresh after 12 hours
3600 ; Retry after one hour
2419200 ; Expire after 4 weeks
1200 ) ; Negative cache TTL of 20 minutes
;
; Authoritative name servers
;
IN NS ns01.example.com.
;
; Host
;
bar 1800 IN A 12.34.56.78
サーバの引き渡し
例えば下のような設定ワークシートをたくさん書かなければならないときでも、AWS SDKを使えば労力を抑えられる。
仕様書をExcelで自動生成している例を見つけたので、最後にリンクを載せておく。
https://dev.classmethod.jp/cloud/excel_aws_spec_autogeneration/