20190714のLinuxに関する記事は4件です。

AWSでゼロからサーバを立ち上げるまで

Amazon EC2 の初期導入を代行した。
2019年7月時点のAWS画面を用いて、クラウド初級者向けに実例を示して手順を説明する。

AWSアカウントの作成

何はともあれアカウントを作成しなければ始まらない。公式チュートリアルの AWSアカウント作成の流れ に沿って進めよう。
アカウント作成後は、下表チェックリストに従って速やかにセキュリティ対策を行うこと。

確認事項 チェック
ルートアカウント(特権ユーザ)のMFA(多要素認証、2段階認証)を有効にしたか? :heavy_check_mark:
日常の操作にルートアカウントを使うことがないように、管理用のIAMユーザを作成したか? :heavy_check_mark:
アクセス許可の管理を容易にするため、IAMグループを作成したか? :heavy_check_mark:
強力なIAMパスワードポリシーを設定したか? :heavy_check_mark:
未使用のアクセスキーは削除されているか? :heavy_check_mark:

具体的な手順は@tmknomさんの記事、AWSアカウントを取得したら速攻でやっておくべき初期設定まとめに書かれているので参照して欲しい。

AWSマネジメントコンソールにログイン

ルートアカウントからログアウトし、先ほど作成した管理用のIAMユーザでコンソールにログインしなおす。

経理部門用IAMユーザの作成

経理部門が請求情報を確認するためのアカウントを作成しよう。
AWSに直接携わっていない経理担当者にこのアカウントを持たせることで、サービスを誤って停止してしまうといった事故を防止できる。

ポリシーの作成

IAMのメニュー [ポリシー] :arrow_right: [ポリシーの作成] をクリックする。
image.png
AWSユーザーガイド【例8:アカウント設定へのアクセスは拒否し、その他の請求および使用状況の情報へのフルアクセスは許可する】のJSONテキストをコピペする。
image.png

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のメニュー [グループ] :arrow_right: [新しいグループの作成] から任意の名前でグループを作成し、前項のポリシーをアタッチする。

ユーザーの作成

IAMのメニュー [ユーザー] :arrow_right: [ユーザーを追加] から任意の名前でユーザーを作成し、前項のグループに追加する。

インスタンスの作成

メニュー [EC2] を選択する。作成前に今のリージョンを確認しておこう。(今回は東京を選択する)
image.png

EC2のメニュー [インスタンス] :arrow_right: [インスタンスの作成] をクリックする。
image.png

Amazonマシンイメージ(AMI)の選択

AMIには、AWSが提供するもの、ユーザーコミュニティが提供するもの、ソフトウェアベンダーが提供するもの(Marketplace)がある。
今回は、MarketplaceからUbuntu 18.04を選択する。
image.png

インスタンスタイプの選択

ここではm5.largeを選択(1時間当たり約13円)。今あえて前世代のm4.largeを選択する理由も無いだろう。
image.png
:book: Amazon EC2 インスタンスタイプ

インスタンスの詳細の設定

インスタンスを誤って削除しないように、削除保護の有効化をチェックしておくと安全だ。

ストレージの追加

今回は、IoT機器からセンサーのデータを受け取るWeb/DBサーバを構築するので、パーティションを下表のように分割した。

デバイス      容量 マウント先 備考
/dev/sda1 30GB /
/dev/sdb 100GB /data MongoDB(スキーマレスのNoSQL型データベース)で使うため、IOPS重視とする。
/dev/sdc 500GB /archive ログやビッグデータなど大量データを保存するのに使うため、スループット重視とする。

[新しいボリュームの追加] をクリックし、次のように入力。
image.png
:book: Amazon EBS ボリュームの種類
:book: Amazon EBS の料金

セキュリティグループの設定

要はファイアウォールのことだ。特に解説は不要だろう。
image.png
:book: VPC のセキュリティグループ

新しいキーペアの作成

インスタンス作成の最終工程である。
[キーペアのダウンロード][インスタンスの作成] の順にクリックすれば完了する。
image.png
もし、下のようなメッセージが出ても、暫くして再試行すれば問題ないので慌てずに。
image.png

IPアドレスを割り当てる

インスタンス作成時に自動付与されたパブリックIPアドレス(グローバルIPアドレス)は変化する場合があるので、固定化する。
EC2のメニュー [Elastic IP] :arrow_right: [新しいアドレスの割り当て] をクリックする。
image.png
image.png

IPアドレスをインスタンスに関連付ける

割り当てされたIPアドレスを選択し、アクションメニューからインスタンスに関連付けよう。
image.png
リソースタイプにインスタンス、インスタンスにはインスタンスIDを指定する。
image.png
image.png

以上でコンソール側の操作は終わりだ。

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/fstab
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し、

/etc/sudoers.d/90-cloud-init-users
user   ALL = NOPASSWD:ALL

のように追加する。

ホスト名の変更

EC2では、ホスト名の初期値がプライベートIPアドレス(例:ip-12-34-56-78)になっている。
これがシェルプロンプトの一部に表示されるのだが、いくつも端末を立ち上げていると今どこにいるか分かり難く、危険なので変更する。

hostnamectl set-hostname newhostname

バックアップの取得

開発者にサーバを引き渡す前にバックアップ(スナップショット)を取得するため、再びコンソールにログインする。

インスタンスの停止

必須ではないが推奨されている。
アクションメニューの [インスタンスの状態] から [停止] をクリックする。
EC2では [停止][終了] は意味がまったく違うので気を付けよう。
image.png

スナップショットの作成

image.png
リソースタイプにインスタンスを選択し、対象インスタンスを選ぶだけでOKだ。
image.png

これでスナップショットからいつでも復元できる。
復元のやり方は何パターンかあり、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/
image.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWSでゼロからUbuntuを立ち上げるまで

Amazon EC2 の初期導入を代行した。
2019年7月時点のAWS画面を用いて、クラウド初級者向けに実例を示して手順を説明する。

AWSアカウントの作成

何はともあれアカウントを作成しなければ始まらない。公式チュートリアルの AWSアカウント作成の流れ に沿って進めよう。
アカウント作成後は、下表チェックリストに従って速やかにセキュリティ対策を行うこと。

確認事項 チェック
ルートアカウント(特権ユーザ)のMFA(多要素認証、2段階認証)を有効にしたか? :heavy_check_mark:
日常の操作にルートアカウントを使うことがないように、管理用のIAMユーザを作成したか? :heavy_check_mark:
アクセス許可の管理を容易にするため、IAMグループを作成したか? :heavy_check_mark:
強力なIAMパスワードポリシーを設定したか? :heavy_check_mark:
未使用のアクセスキーは削除されているか? :heavy_check_mark:

具体的な手順は@tmknomさんの記事、AWSアカウントを取得したら速攻でやっておくべき初期設定まとめに書かれているので参照して欲しい。

AWSマネジメントコンソールにログイン

ルートアカウントからログアウトし、先ほど作成した管理用のIAMユーザでコンソールにログインしなおす。

経理部門用IAMユーザの作成

経理部門が請求情報を確認するためのアカウントを作成しよう。
AWSに直接携わっていない経理担当者にこのアカウントを持たせることで、サービスを誤って停止してしまうといった事故を防止できる。

ポリシーの作成

IAMのメニュー [ポリシー] :arrow_right: [ポリシーの作成] をクリックする。
image.png
AWSユーザーガイド【例8:アカウント設定へのアクセスは拒否し、その他の請求および使用状況の情報へのフルアクセスは許可する】のJSONテキストをコピペする。
image.png

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のメニュー [グループ] :arrow_right: [新しいグループの作成] から任意の名前でグループを作成し、前項のポリシーをアタッチする。

ユーザーの作成

IAMのメニュー [ユーザー] :arrow_right: [ユーザーを追加] から任意の名前でユーザーを作成し、前項のグループに追加する。

インスタンスの作成

メニュー [EC2] を選択する。作成前に今のリージョンを確認しておこう。(今回は東京を選択する)
image.png

EC2のメニュー [インスタンス] :arrow_right: [インスタンスの作成] をクリックする。
image.png

Amazonマシンイメージ(AMI)の選択

AMIには、AWSが提供するもの、ユーザーコミュニティが提供するもの、ソフトウェアベンダーが提供するもの(Marketplace)がある。
今回は、MarketplaceからUbuntu 18.04を選択する。
image.png

インスタンスタイプの選択

ここではm5.largeを選択(1時間当たり約13円)。今あえて前世代のm4.largeを選択する理由も無いだろう。
image.png
:book: Amazon EC2 インスタンスタイプ

インスタンスの詳細の設定

インスタンスを誤って削除しないように、削除保護の有効化をチェックしておくと安全だ。

ストレージの追加

今回は、IoT機器からセンサーのデータを受け取るWeb/DBサーバを構築するので、パーティションを下表のように分割した。

デバイス      容量 マウント先 備考
/dev/sda1 30GB /
/dev/sdb 100GB /data MongoDB(スキーマレスのNoSQL型データベース)で使うため、IOPS重視とする。
/dev/sdc 500GB /archive ログやビッグデータなど大量データを保存するのに使うため、スループット重視とする。

[新しいボリュームの追加] をクリックし、次のように入力。
image.png
:book: Amazon EBS ボリュームの種類
:book: Amazon EBS の料金

セキュリティグループの設定

要はファイアウォールのことだ。特に解説は不要だろう。
image.png
:book: VPC のセキュリティグループ

新しいキーペアの作成

インスタンス作成の最終工程である。
[キーペアのダウンロード][インスタンスの作成] の順にクリックすれば完了する。
image.png
もし、下のようなメッセージが出ても、暫くして再試行すれば問題ないので慌てずに。
image.png

IPアドレスを割り当てる

インスタンス作成時に自動付与されたパブリックIPアドレス(グローバルIPアドレス)は変化する場合があるので、固定化する。
EC2のメニュー [Elastic IP] :arrow_right: [新しいアドレスの割り当て] をクリックする。
image.png
image.png

IPアドレスをインスタンスに関連付ける

割り当てされたIPアドレスを選択し、アクションメニューからインスタンスに関連付けよう。
image.png
リソースタイプにインスタンス、インスタンスにはインスタンスIDを指定する。
image.png
image.png

以上でコンソール側の操作は終わりだ。

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/fstab
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し、

/etc/sudoers.d/90-cloud-init-users
user   ALL = NOPASSWD:ALL

のように追加すれば良い。

ホスト名の変更

EC2では、ホスト名の初期値がプライベートIPアドレス(例:ip-12-34-56-78)になっている。
これがシェルプロンプトの一部に表示されるのだが、いくつも端末を立ち上げていると今どこにいるか分からなくなり易いので変更する。

hostnamectl set-hostname newhostname

バックアップの取得

開発者にサーバを引き渡す前にバックアップ(スナップショット)を取得するため、再びコンソールにログインする。

インスタンスの停止

必須ではないが推奨されている。
アクションメニューの [インスタンスの状態] から [停止] をクリックする。
EC2では [停止(stopped)][終了(terminated)] は意味がまったく違うので気を付けよう。
image.png

スナップショットの作成

image.png
リソースタイプにインスタンスを選択し、対象インスタンスを選ぶだけでOKだ。
image.png

これでスナップショットからいつでも復元できるようになる。
復元のやり方は何パターンかあり、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/
image.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

SMARTでSSDのチェック

準備

apt install smartmontools

チェック実行

check.sh
# information
smartctl -i /dev/sda

# short test
smartctl -t short /dev/sda
sleep 60

# long test
#smartctl -t long /dev/sda
#sleep 300

# log view
smartctl -l selftest /dev/sda

# all view
#smartctl -a /dev/sda
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[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するとコンフリクトを起こすのをわかっていて解消がめんどくさいし不要というときなどに使うのかも

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む