🐥

AWSでサーバーを構築してみる~インスタンス詳細設定④~

2021/01/22に公開

はじめに

くーばねてすをやっつけるためにこれまでにLinuxさんと密に仲良くさせていただいたが、新たなステージに上がるためについにAWSさんに会いに行くことにした。AWSさんと仲良くなることでLinuxさんのファイルシステムだけでなく、インターネットの仕組みの理解につながると思い勉強する。今回はその第1歩としてAWSを使ってWordPressでブログシステムを構築しようと思う。

概要

■インスタンスの詳細の設定④
をまとめた!

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

インスタンスの詳細の設定画面を開いたら詳細設定をする。

ここの画面で設定できるのはこれ↓
ノーマルの設定では、
インスタンス数
購入のオプション
ネットワーク
サブネット
自動割り当てパブリック IP
配置グループ
キャパシティーの予約
ドメイン結合ディレクトリ
IAM ロール
CPU オプション
シャットダウン動作
停止 - 休止動作
終了保護の有効化
モニタリング
テナンシー
Elastic Inference
クレジット仕様
ファイルシステム

↓今回はここから(^_-)-☆
ネットワークインターフェイス
高度な詳細では、
Enclave
アクセス可能なメタデータ
メタデータのバージョン
メタデータトークンレスポンスのホップ制限
ユーザーデータ

が設定できる!詳細設定のよくわからない項目をまとめてみた。

■ネットワークインターフェイス

VPC の各インスタンスには、複数のプライベート IP アドレスなど多様な属性をサポートするバーチャルネットワークインターフェイスである、デフォルトの Elastic Network Interface があります。1 つのインスタンスを起動中に、1 つまたは複数のネットワークインターフェイスをアタッチできます。選択したインスタンスタイプでサポートしていれば、インスタンス作成後、EC2 コンソールを使い、さらにネットワークインターフェイスをアタッチできます。複数のネットワークカードをサポートするインスタンスタイプを選択した場合は、各ネットワークインターフェイスにネットワークカードインデックスを指定できます。

https://business.ntt-east.co.jp/content/cloudsolution/column-14.html
AWSでVPCに対してネットワークインターフェースを追加する役割を担うのがAmazon NIC(Network Interface Card)という。
物理的な環境におけるNIC(Network Interface Card)と同じ役割と考えていい。
設定できるIPアドレスの数には、選択するインスタンスに応じて制限があるのでいくつか設定したい場合は気を付ける。
NICを利用することでの追加料金は発生しない。利用制限外での場合は追加料金がかかる。
VPC の各インスタンスには、プライマリネットワークインターフェイス (eth0) と呼ばれるデフォルトのネットワークインターフェイスが存在する
ネットワークインターフェースで設定できること
・プライベートIPv4アドレス(VPCのアドレス範囲内)の設定
・固定IPアドレス(Elastic IPアドレス)の設定
・IPv6アドレスの設定
・セキュリティグループの設定
・MACアドレスの管理
・ルーティング情報の設定

デフォルトでインターフェイスがあるので今回はいらない!(^_-)-☆

■Enclave

AWS Nitro Enclaves っていうサービス使うか?ってことらしい。
AWS Nitro Enclavesとは
https://aws.amazon.com/jp/ec2/nitro/nitro-enclaves/

Nitro Enclave では、EC2 インスタンス内で機密性の高いデータを保護および処理できます。

AWS Nitro Enclaves では、高度な機密情報の保護や安全措置を向上する、分離されたコンピューティング環境を、お客様が作成することができます。これにより、Amazon EC2 インスタンスに保存する、個人が特定可能な情報 (PII) 、医療、金融、知的財産データなどに対応します。Nitro Enclaves では、EC2 インスタンスで CPU とメモリの分離を行っているのと同じ、Nitro Hypervisor テクノロジーを採用しています。

機密性の高いデータを保護および安全に処理するためのサービスらしい。機密情報...!
https://dev.classmethod.jp/articles/nitro-enclaves-getting-started/

OS上での環境分離というとDockerのようなコンテナ技術が思い浮かびますが、Dockerであれば親のEC2インスタンスからdocker exec等のコマンドを使って、いわゆる「コンテナの中に入る」ことでコンテナ内で任意のコマンドを実行できますが、Enclaveではこういった操作ができないような設計になっているのがポイントです。

コンテナっぽい構成だけど、コンテナの中にはいることはできないらしい。
AWS Nitro Enclaves attestationってサービスの認証方式を使って操作するらしい。機密情報...!
今回は機密情報は特にないのでいらない!(^_-)-☆

■アクセス可能なメタデータ 、メタデータのバージョン 、メタデータトークンレスポンスのホップ制限

アクセス可能なメタデータ

インスタンスメタデータサービスの HTTP エンドポイントを無効にすることで、インスタンスメタデータへのアクセスを無効にできます。

メタデータのバージョン

V1 と V2、または V2 のみを実行できます。

メタデータトークンレスポンスのホップ制限

メタデータトークンが移動できるネットワークホップの数。デフォルトは 1 です。最大は 64 です。

インスタンスメタデータって?
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instance-metadata.html

インスタンスメタデータは、インスタンスに関するデータで、実行中のインスタンスを設定または管理するために使用します。

重要
インスタンスメタデータおよびユーザーデータにはそのインスタンス自体内からのみアクセスできるものの、データは認証または暗号化手法によって保護されていません。インスタンス、そしてインスタンス上で実行される任意のソフトウェアに対して直接アクセス権がある可能性がある人は、メタデータを表示できます。そのため、パスワードまたは存続期間の長い暗号化キーなどの機密データは、ユーザーデータとして保管しないようにしてください。

EC2のインスタンスメタデータはOS上から取得できるEC2のメタデータ情報でインスタンスID、インスタンスタイプ、使用されたAMI ID、ホスト名、IAMロール名、プライベートIPアドレス、所属しているAZ、Public/ElasticIPアドレスなどが取得できるそうだ。

インスタンスメタデータサービスのバージョンは2つあってv1とv2両方使用か、v2のみ使用か選択することができる。
https://dev.classmethod.jp/articles/ec2-imdsv2-release/
v1では
メタデータの取得は簡単でインスタンスメタデータサービスが169.254.169.254というリンクローカルIPで動作しているので、curlコマンド等によりアクセスすることで取得できる。

v1によるインスタンスメタデータの取得
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/

v2では
IMDSv2ではメタデータへのアクセスの前にセッショントークンを取得する必要がある。

v2でのインスタンスメタデータの取得
$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
&& curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/

セッショントークンの取得はメタデータへのHTTP PUTリクエストで行う。
このような処理をしないとメタデータを取得することができない。
他に
v1を無効化できる(デフォルトでは併用可能).
メタデータサービス自体を無効化できる
メタデータレスポンスのTTLを短くし複数ホストを経由した取得を防止できる
X-Forwarded-ForヘッダーがあるリクエストにTokenを発行しない
メタデータレスポンスのTTLを短くし複数ホストを経由した取得を防止できる
といった設定ができる。

メタデータの一時的なアクセスキーを発行する機能を使った悪用が増えており、個人情報流出などが問題になったのでこのようなサービスが増えたのだと思う(>_<)

今回はテストなのでデフォルトでOK!(^_-)-☆

■ユーザーデータ

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/user-data.html#user-data-cloud-init

作成時にインスタンスを設定するユーザーデータまたは設定スクリプトを実行するユーザーデータを指定できます。複数のインスタンスを同時に作成する場合、ユーザーデータは予約されたすべてのインスタンスで使用可能です。

ユーザーデータとはOSの起動スクリプトでEC2インスタンスの初回起動時(作成時)に実行したい処理を設定することができる。

コマンドの実行は初回起動時のみだが、再起動するたびにコマンド実行も設定できる。
https://qiita.com/zaki-lknr/items/197ea366bd4243b78e69

一番簡単な方法はシェルスクリプトを書くこと
また1行目に#cloud-configと記述するとcloud-initと同じようなLinuxの初期設定ができる。

今回はLinuxさんもちゃんと勉強したいのではぶく!
タイムゾーンの設定だけしておく。

#cloud-config

timezone: "Asia/Tokyo"

今度ちゃんと#cloud-configの勉強するからな!

まとめ

長いので続く!

Discussion