- 投稿日:2019-07-14T22:05:37+09:00
AWSでゼロからサーバを立ち上げるまで
Amazon EC2 の初期導入を代行した。
2019年7月時点のAWS画面を用いて、クラウド初級者向けに実例を示して手順を説明する。AWSアカウントの作成
何はともあれアカウントを作成しなければ始まらない。公式チュートリアルの AWSアカウント作成の流れ に沿って進めよう。
アカウント作成後は、下表チェックリストに従って速やかにセキュリティ対策を行うこと。
確認事項 チェック ルートアカウント(特権ユーザ)のMFA(多要素認証、2段階認証)を有効にしたか? 日常の操作にルートアカウントを使うことがないように、管理用のIAMユーザを作成したか? アクセス許可の管理を容易にするため、IAMグループを作成したか? 強力なIAMパスワードポリシーを設定したか? 未使用のアクセスキーは削除されているか? 具体的な手順は@tmknomさんの記事、AWSアカウントを取得したら速攻でやっておくべき初期設定まとめに書かれているので参照して欲しい。
AWSマネジメントコンソールにログイン
ルートアカウントからログアウトし、先ほど作成した管理用のIAMユーザでコンソールにログインしなおす。
経理部門用IAMユーザの作成
経理部門が請求情報を確認するためのアカウントを作成しよう。
AWSに直接携わっていない経理担当者にこのアカウントを持たせることで、サービスを誤って停止してしまうといった事故を防止できる。ポリシーの作成
IAMのメニュー [ポリシー] [ポリシーの作成] をクリックする。
AWSユーザーガイド【例8:アカウント設定へのアクセスは拒否し、その他の請求および使用状況の情報へのフルアクセスは許可する】のJSONテキストをコピペする。
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] を選択する。作成前に今のリージョンを確認しておこう。(今回は東京を選択する)
EC2のメニュー [インスタンス] [インスタンスの作成] をクリックする。
Amazonマシンイメージ(AMI)の選択
AMIには、AWSが提供するもの、ユーザーコミュニティが提供するもの、ソフトウェアベンダーが提供するもの(Marketplace)がある。
今回は、MarketplaceからUbuntu 18.04
を選択する。
インスタンスタイプの選択
ここでは
m5.large
を選択(1時間当たり約13円)。今あえて前世代のm4.large
を選択する理由も無いだろう。
Amazon EC2 インスタンスタイプインスタンスの詳細の設定
インスタンスを誤って削除しないように、削除保護の有効化をチェックしておくと安全だ。
ストレージの追加
今回は、IoT機器からセンサーのデータを受け取るWeb/DBサーバを構築するので、パーティションを下表のように分割した。
デバイス 容量 マウント先 備考 /dev/sda1 30GB / /dev/sdb 100GB /data MongoDB(スキーマレスのNoSQL型データベース)で使うため、IOPS重視とする。 /dev/sdc 500GB /archive ログやビッグデータなど大量データを保存するのに使うため、スループット重視とする。 [新しいボリュームの追加] をクリックし、次のように入力。
Amazon EBS ボリュームの種類
Amazon EBS の料金セキュリティグループの設定
要はファイアウォールのことだ。特に解説は不要だろう。
VPC のセキュリティグループ新しいキーペアの作成
インスタンス作成の最終工程である。
[キーペアのダウンロード]、[インスタンスの作成] の順にクリックすれば完了する。
もし、下のようなメッセージが出ても、暫くして再試行すれば問題ないので慌てずに。
IPアドレスを割り当てる
インスタンス作成時に自動付与されたパブリックIPアドレス(グローバルIPアドレス)は変化する場合があるので、固定化する。
EC2のメニュー [Elastic IP] [新しいアドレスの割り当て] をクリックする。
IPアドレスをインスタンスに関連付ける
割り当てされたIPアドレスを選択し、アクションメニューからインスタンスに関連付けよう。
リソースタイプにインスタンス、インスタンスにはインスタンスIDを指定する。
以上でコンソール側の操作は終わりだ。
Linuxの初期設定
インスタンス作成時にダウンロードしたキーペア(秘密鍵)を使い、サーバにログインする。
Ubuntuの場合、初期ユーザー名はec2-user
ではなくubuntu
になる。パッケージ更新
sudo su - 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
コマンドでも確認できる。/etc/fstabUUID=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
し、/etc/sudoers.d/90-cloud-init-usersuser ALL = NOPASSWD:ALLのように追加する。
ホスト名の変更
EC2では、ホスト名の初期値がプライベートIPアドレス(例:
ip-12-34-56-78
)になっている。
これがシェルプロンプトの一部に表示されるのだが、いくつも端末を立ち上げていると今どこにいるか分かり難く、危険なので変更する。hostnamectl set-hostname newhostnameバックアップの取得
開発者にサーバを引き渡す前にバックアップ(スナップショット)を取得するため、再びコンソールにログインする。
インスタンスの停止
必須ではないが推奨されている。
アクションメニューの [インスタンスの状態] から [停止] をクリックする。
EC2では [停止] と [終了] は意味がまったく違うので気を付けよう。
スナップショットの作成
リソースタイプにインスタンスを選択し、対象インスタンスを選ぶだけでOKだ。
これでスナップショットからいつでも復元できる。
復元のやり方は何パターンかあり、Qiitaにも記事は沢山あるので色々試してみて欲しい。DNS登録
ネームサーバを自前で管理しているので、今回は Route 53 を使わない。
ゾーンファイルにAレコードを追加する。/usr/local/etc/namedb/master/example.com.zone$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 300 IN A 12.34.56.78サーバの引き渡し
例えば下のような設定ワークシートをたくさん書かなければならないときでも、AWS SDKを使えば労力を抑えられる。
仕様書をExcelで自動生成している例を見つけたので、最後にリンクを載せておく。
https://dev.classmethod.jp/cloud/excel_aws_spec_autogeneration/
- 投稿日:2019-07-14T22:05:37+09:00
AWSでゼロからUbuntuを立ち上げるまで
Amazon EC2 の初期導入を代行した。
2019年7月時点のAWS画面を用いて、クラウド初級者向けに実例を示して手順を説明する。AWSアカウントの作成
何はともあれアカウントを作成しなければ始まらない。公式チュートリアルの AWSアカウント作成の流れ に沿って進めよう。
アカウント作成後は、下表チェックリストに従って速やかにセキュリティ対策を行うこと。
確認事項 チェック ルートアカウント(特権ユーザ)のMFA(多要素認証、2段階認証)を有効にしたか? 日常の操作にルートアカウントを使うことがないように、管理用のIAMユーザを作成したか? アクセス許可の管理を容易にするため、IAMグループを作成したか? 強力なIAMパスワードポリシーを設定したか? 未使用のアクセスキーは削除されているか? 具体的な手順は@tmknomさんの記事、AWSアカウントを取得したら速攻でやっておくべき初期設定まとめに書かれているので参照して欲しい。
AWSマネジメントコンソールにログイン
ルートアカウントからログアウトし、先ほど作成した管理用のIAMユーザでコンソールにログインしなおす。
経理部門用IAMユーザの作成
経理部門が請求情報を確認するためのアカウントを作成しよう。
AWSに直接携わっていない経理担当者にこのアカウントを持たせることで、サービスを誤って停止してしまうといった事故を防止できる。ポリシーの作成
IAMのメニュー [ポリシー] [ポリシーの作成] をクリックする。
AWSユーザーガイド【例8:アカウント設定へのアクセスは拒否し、その他の請求および使用状況の情報へのフルアクセスは許可する】のJSONテキストをコピペする。
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] を選択する。作成前に今のリージョンを確認しておこう。(今回は東京を選択する)
EC2のメニュー [インスタンス] [インスタンスの作成] をクリックする。
Amazonマシンイメージ(AMI)の選択
AMIには、AWSが提供するもの、ユーザーコミュニティが提供するもの、ソフトウェアベンダーが提供するもの(Marketplace)がある。
今回は、MarketplaceからUbuntu 18.04
を選択する。
インスタンスタイプの選択
ここでは
m5.large
を選択(1時間当たり約13円)。今あえて前世代のm4.large
を選択する理由も無いだろう。
Amazon EC2 インスタンスタイプインスタンスの詳細の設定
インスタンスを誤って削除しないように、削除保護の有効化をチェックしておくと安全だ。
ストレージの追加
今回は、IoT機器からセンサーのデータを受け取るWeb/DBサーバを構築するので、パーティションを下表のように分割した。
デバイス 容量 マウント先 備考 /dev/sda1 30GB / /dev/sdb 100GB /data MongoDB(スキーマレスのNoSQL型データベース)で使うため、IOPS重視とする。 /dev/sdc 500GB /archive ログやビッグデータなど大量データを保存するのに使うため、スループット重視とする。 [新しいボリュームの追加] をクリックし、次のように入力。
Amazon EBS ボリュームの種類
Amazon EBS の料金セキュリティグループの設定
要はファイアウォールのことだ。特に解説は不要だろう。
VPC のセキュリティグループ新しいキーペアの作成
インスタンス作成の最終工程である。
[キーペアのダウンロード]、[インスタンスの作成] の順にクリックすれば完了する。
もし、下のようなメッセージが出ても、暫くして再試行すれば問題ないので慌てずに。
IPアドレスを割り当てる
インスタンス作成時に自動付与されたパブリックIPアドレス(グローバルIPアドレス)は変化する場合があるので、固定化する。
EC2のメニュー [Elastic IP] [新しいアドレスの割り当て] をクリックする。
IPアドレスをインスタンスに関連付ける
割り当てされたIPアドレスを選択し、アクションメニューからインスタンスに関連付けよう。
リソースタイプにインスタンス、インスタンスにはインスタンスIDを指定する。
以上でコンソール側の操作は終わりだ。
Linuxの初期設定
インスタンス作成時にダウンロードしたキーペア(秘密鍵)を使い、サーバにログインする。
Ubuntuの場合、初期ユーザー名はec2-user
ではなくubuntu
になる。パッケージ更新
sudo su - 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
コマンドでも確認できる。/etc/fstabUUID=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
し、/etc/sudoers.d/90-cloud-init-usersuser ALL = NOPASSWD:ALLのように追加すれば良い。
ホスト名の変更
EC2では、ホスト名の初期値がプライベートIPアドレス(例:
ip-12-34-56-78
)になっている。
これがシェルプロンプトの一部に表示されるのだが、いくつも端末を立ち上げていると今どこにいるか分からなくなり易いので変更する。hostnamectl set-hostname newhostnameバックアップの取得
開発者にサーバを引き渡す前にバックアップ(スナップショット)を取得するため、再びコンソールにログインする。
インスタンスの停止
必須ではないが推奨されている。
アクションメニューの [インスタンスの状態] から [停止] をクリックする。
EC2では [停止(stopped)] と [終了(terminated)] は意味がまったく違うので気を付けよう。
スナップショットの作成
リソースタイプにインスタンスを選択し、対象インスタンスを選ぶだけでOKだ。
これでスナップショットからいつでも復元できるようになる。
復元のやり方は何パターンかあり、Qiitaにも記事は沢山あるので色々試してみて欲しい。DNS登録
ネームサーバを自前で管理しているので、今回は Route 53 を使わない。
ゾーンファイルにAレコードを追加する。/usr/local/etc/namedb/master/example.com.zone$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 300 IN A 12.34.56.78サーバの引き渡し
例えば下のような設定ワークシートをたくさん書かなければならないときでも、AWS SDKを使えば労力を抑えられる。
仕様書をExcelで自動生成している例を見つけたので、最後にリンクを載せておく。
https://dev.classmethod.jp/cloud/excel_aws_spec_autogeneration/
- 投稿日:2019-07-14T21:30:27+09:00
SMARTでSSDのチェック
- 投稿日:2019-07-14T16:48:03+09:00
[Updates were rejected because the tip of your current branch is behind] エラー解説、解消法
Gitでバージョン管理をしていると、
! [rejected] hint: Updates were rejected because the tip of your current branch is behind hint: its remote counterpart. Merge the remote changes (e.g. 'git pull') hint: before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details.こんな感じのエラーメッセージとともにpushが拒まれることがあります。
エラーの意味
このエラーは
the tip of your current branch is behind
この文章にもあるように、プッシュしようとしている作業ブランチの最新のコミットが、リモートリポジトリの最新のコミットよりも後ろにある
という意味で、
最新のブランチをpullせずに編集してしまったり、
編集の際にgit reset
などでどこかしらの過去のコミットの場面に戻って修正してしまっていたときに起こり得ます。エラー解消法
解消法は2つあります。
git pullで最新の状態のブランチを取得してからpush
まず1つ目は
Merge the remote changes (e.g. 'git pull')
このヒントメッセージにもあるように、リモートリポジトリにある最新のブランチをpullするという方法です。
git pull (origin 作業ディレクトリ)
一旦最新のリポジトリを最新の状態にしてしまえば、このようなエラーが起きることはありません。
強制push(乱用注意)
めちゃくちゃ危険な方法ですが、以下のように今の状態で強制的にpushしてしまう方法もあります
git push -f リモートリポジトリ 作業ブランチ
これは共同開発をしている場合に乱用は避けなくてはいけませんが、 (他の人が、前の状態をpullしてた場合、強制pushの内容をpull出来なくなってしまったりして他の人にも影響が出る可能性もあるので)
1人で開発していて、他に迷惑がかかることがなかったり最新の状態をpullするとコンフリクトを起こすのをわかっていて解消がめんどくさいし不要というときなどに使うのかも