awsざっくりキャッチアップ 1

awsとは、アマゾンウェブサービス社が提供しているクラウドサービスのことである。

クラウドとは、サーバー、ストレージ、データベース、ネットワークなどのコンピュータ資源を、インターネットなどのネットワークを通じてサービスとして提供する形態のこと

クラウドは、提供するサービスのレベルによって様々な形態がある(Iaas, Paas, SaaS)
Vercelとかは、PaaSに分類される

AWSは当初IaaS(サーバーの時間貸し)をしていたが、サーバーレスやAI機能のサービスなどもリリースされているので、AWSは、IaaSの枠を超えたクラウド形態に成長している。

AWSの「サービス」(AWSサービス)とは、AWSが提供している様々な機能のこと。
(例、EC2やS3といったサービス)
AWSの「リソース」とは、AWSサービスを使って作成されたもののことである。

awsサービスを利用するとき、awsアカウントを作成する必要がある。
そして、awsアカウントは、awsのリソースを管理するために使われる。
awsアカウント同士で、awsのリソースを共有したりできないので注意。
(awsアカウントごとに独立した環境がある)

ルートユーザーが乗っ取られると、不正利用されて、多額の請求されたりするのでめんどい

awsアカウントを作成すると自動的にユーザーも作成されて、このユーザーをルートユーザーと呼ぶ。
強力な権限を持っているので、このアカウントの中に必要な権限のみに制限したユーザーを作成して、このユーザーでリソースの作成とかを行う。

リージョンとは、世界中の地理的にはなれた領域のこと
リージョン内にデーターセンターがある

AWS Identity and Access Management (IAM) は、AWS リソースへのアクセスを安全に管理するためのウェブサービスです
IAM を使用して、誰を認証 (サインイン) し、誰にリソースの使用を認可する (アクセス許可を付与する) かを制御します
IAMは、awsリソースへのアクセスを安全に管理するためのサービス。
IAMを使用することで、誰を認証して、誰にリソースの使用を許可するかを設定できる

ユーザーごとに認可を設定するのはめんどい。
なので、グループを使った認可の設定がある。

グループに認可を設定すれば、そのグループに所属する人はその認可になるから、ユーザーが増えても、そのグループに所属させたり、認可の条件が変更したりしても、変更が楽なのか

IAMのセキュリティベストプラクティス
- ルートユーザーのアクセスキーを削除
- ルートユーザーのMFAを有効化
- 個々のIAMユーザーの作成
- グループを使用したアクセス許可の割り当て
- IAMパスワードポリシーの適用

デフォルトだとルートユーザーにはアクセスキーは作成されない。
ルートユーザーのアクセスキーが漏れるとめんどいから、そもそもルートユーザーのアクセスキーをプログラム上で使わない方が良い。

初期設定だと、ルートユーザーはメアドとpassでログインできる
権限強いのに、安全な認証方法と言えないので、ルートユーザーのログインに関しては、MFAを導入した方が良い。

awsでは、スマホを仮想MFAデバイスとして、MFAを実現することができる。

ルートユーザーは権限が強すぎるから、通常の開発では一般ユーザー(IAMユーザー)を作成した方が良い

IAMでユーザー追加するとき、urlとnameとpasswordが表示されるから、それはメモしとく
urlでアクセスするとログイン画面になってidが勝手に入力されている。あとは、nameとpassを入れたらそのIAMユーザーでログインできる。ログイン成功したらパスワードリセット画面になって、自動パスワードをオリジナルのパスワードに変更する。
デフォルトの認可はIAMUserChangePasswordしかないのか

確かにこうなるな

グループにAWSリソースの認可を設定する際に、それぞれのリソースに対して認可を設定するのは現実的ではない。なので、複数のリソースへの認可を束ねたポリシーという概念があって、そのポリシーをグループにアタッチ(設定)した方が良い。

グループにPowerUserAccessとIAMFullAccessというポリシーをアタッチして、そのグループにさっきのIAMユーザー所属させたら、IAM使えるようになってた

IAMのパスワードポリシー設定から、所属企業のポリシーに従うように設定できたりするのか。

- IAMグループとは、IAMユーザーをグループ単位で管理するための仕組み。
- IAMユーザーと同じく、IAMグループにもIAMポリシーを付与できる。
- IAMグループにIAMユーザーを所属させると、そのIAMユーザーにもIAMグループのIAMポリシーが付与される。

NATゲートウェイ、ElasticIpは1h単位で使用料がかかるので、学習終了したらリソースをすぐ消す

コンピュータネットワークとは、複数台のコンピュータを相互に接続して、相互に情報をやりとりする技術や状態のこと
コンピュータネットワークを構築するためには、物理的な設定をした後に、論理的な設定をする必要がある

クラウドを使わないネットワークを用意する場合、サーバーやケーブルやネットワーク機器などは、物理的なものを用意して構築する必要があった。
AWSでネットワークを構築する時は、VPCというサービスを使うと仮想的なネットワークを作ることができる。
VPCの中にネットワーク機器に相当するリソースを追加していく。
VPC同士はお互いに独立していて、お互いが影響し合うことがないようになっている。

vpcはリージョンごとに作るサービス

CIDR表記は、管理するIPアドレスの範囲を簡潔に表記する方法
先頭から何ビット目までをネットワーク部とするかを、/の後に書いてる。

IPアドレスの範囲が広い方が、同じネットワーク内にたくさんのIPアドレスを用意できる。
しかし、VPCで指定できるサブネットマスクは最大16ビットまで

下の命名規則でリソース名をつけると良いそう
システム名ーリソース名(-リソース識別し)

社内LANの構築やネットワークの実験時等、インターネットを使用しないときにプライベートIPアドレスを使用します。
ipアドレスには、パブリックipアドレスとプライベートipアドレスの2種類がある。
プライベートipアドレスは社内のLAN構築とかに向いている。
RFC1918で定義されているプライベートipアドレス以外をvpcで使用すると、インターネット内のグローバルipアドレス(= パブリックipアドレス)と重複してサーバーなどと通信できなくなる可能性があるので、注意。

サブネットとは、ネットワーク内のネットワークを分割した小さなネットワークのこと。
サブネットは、vpcのipアドレスの範囲を分割した単位で作る。
サブネットを作成する目的としては、外部公開するサービスかどうかをリソース単位で振り分けなくても管理できたり、耐障害性のために作成する。
(そもそもサブネットはリージョン内のアベイラビリティゾーンに作成する)

作成したサブネットのCIDRブロックは変更できないので、慎重にCIDRを設計する必要がある
サブネットのCIDRブロックを設計するときは、以下を気をつける必要がある。
- 作成するサブネットの数
- サブネット内に作成するリソースの数
この2つはトレードオフの関係である

一般的には、サブネット数とリソース数のそれぞれに余裕を持たせた設計が良い。

IPアドレス範囲をCIDR表記する場合、その範囲は「CIDRブロック」と呼ばれる。

vpc内にサブネットを作るから、サブネットのCIDRブロックはVPCのCIDRブロック内にある必要がある。

サブネットのCIDRをどう設計するかで、そのVPCで使えるサブネットの数と、サブネットないに作成するリソースの数が決まるのか

ネットワーク内のリソースは、ipアドレスによって特定できる。特定することでそのリソースと通信できる
vpcのCIDRブロックが10.0.0.0/16だとすると、ネットワーク部で16ビット使っている
サブネットで4bit使うように設計すると、
サブネットは2 ** 4 = 16個作れて、サブネット内にリソースは2 * 12 = 4091個作れる

サブネットのCIDRブロックって、サブネット自体のbitも指定するのか

サブネットマスクとは、IPアドレスのどの部分がネットワーク部で、どの部分がホスト部かを示す情報。
2進数で表記して、1の部分がネットワーク部で、0の部分がホスト部を表している

ipアドレスの範囲は2つの方法で表記できて、
cidr表記とサブネットマスク表記がある。
サブネットマスク表記は長い。

ネットワーク部は同じネットワークに属する限りは、同じ値である。そしてホスト部が割り当てたいサーバーやクライアント、ネットワーク機器に対する連番となる。

vpcは仮想的なプライベートネットワークを構築する際のAWSサービス
vpcで仮想プライベートネットワークを作る際には、そのネットワークで使用するiPv4アドレスの範囲をipv4CIDRブロックで指定する必要がある。

そのipv4 cidrブロックの範囲に対して、サブネットを作成する

ゲートウェイ (gateway) は、コンピュータネットワークをプロトコルの異なるネットワークと接続するためのネットワークノードである。

IPv4 でインターネット経由の通信ができるようにするには、インスタンスにパブリック IPv4 アドレスが必要です。インスタンスにパブリック IPv4 アドレスが自動的に割り当てられるように VPC を設定するか、インスタンスに Elastic IP アドレスを割り当てることができます。インスタンスは、VPC とサブネット内で定義されたプライベート(内部)IP アドレス空間のみを認識します。インターネットゲートウェイはインスタンスに代わって 1 対 1 の NAT を論理的に行います。そのため、トラフィックが VPC サブネットから出てインターネットへ向かうとき、返信アドレスフィールドは、インスタンスのプライベート IP アドレスではなくパブリック IPv4 アドレスまたは Elastic IP アドレスに設定されます。逆に、インスタンスのパブリック IPv4 アドレスまたは Elastic IP アドレス宛てのトラフィックは、その送信先アドレスがインスタンスのプライベート IPv4 アドレスに変換されてから、VPC に配信されます。
インターネットゲートウェイはパブリックipをプライベートipにnat変換している。なので、プライベートipのcidrブロックのサブネットにアクセスできるのか。
NAT(Network Address Translation)はIPアドレスを変換する技術です。

インターネットゲートウェイとは、VPCで作成されたネットワークとインターネット間の通信を可能にするためのものである。
インターネットゲートウェイがないと、インターネットとvpc内のawsリソースが相互に通信できない

vpcで作成されたリソースがインターネットゲートウェイを通じてインターネットと通信するためには、リソースにパブリックipを割り当てる必要がある。
プライベートサブネットのリソースもインターネットを通じてソフトウェアをインストールしたかったりする(この場合、sshで踏み台経由でプライベートサブネットのリソースにアクセスする)。
しかし、プライベートサブネットのリソースがパブリックipを持つと、インターネット経由でプライベートサブネットのリソースにアクセスできるので、サブネットをパブリックとプライベートに分けた意味がない。
NATゲートウェイは、NATを実現するためのもの。
NATは、ipアドレスを変換する仕組みで、NATを使うことで、プライベートサブネットにいるリソースがインターネットにアクセスできるが、インターネットからのアクセスは禁止することができる。
NATゲートウェイはパブリックなサブネットに対して作成される。NATの機能を持つサーバーをパブリックサブネットに置くみたいなイメージ。

NATゲートウェイは、一つ一つにコストがかかる。

NATゲートウェイの設定画面で接続タイプとある。
インターネットに接続する場合はパブリック。
他のVPCに接続する場合はプライベートにする。

ElasticIPを割り当てで、ElasticIPを自動生成して割り当てることができる

作成したNAT Gatewayが有効になるには少し時間がかかる

awsやってるとパブリックサブネットやプライベートサブネットという言葉をよく聞くが、
特定の設定値があるわけではなくて、
インターネットゲートウェイへのルーティングがあればパブリックサブネット
なければプライベートサブネット
という意味である。

nat gatewayでelastic ipが自動割り当てされるから、natgateway消すときに、elastic ipも消すように気をつけないとな

awsで異なるサブネット内にいるリソース同士は、同じVPC内にいれば通信できる。

ルートテーブルとは、サブネットごとに決める通信経路の設定のこと。
デフォルトだとVPCで作成する全てのサブネットに共通のルートテーブルがアタッチされている。
サブネットごとに通信経路を分けたい時は、用途ごとにルートテーブルを作成してサブネットにアタッチする。
プライベートサブネットとパブリックサブネットのルートテーブルの内容は違うようにしたいから、そのケースだとルートテーブルを分けた方が良い。

ルートテーブルがないと、サブネット同士、またはサブネットと各ゲートウェイの間に通信経路(ネットワーク上の道のようなもの)がなくて、通信できない。

ルートテーブルにルーティング(通信の宛先設定)を定義する

0.0.0.0/0は全てのIPアドレス範囲を示している。ルートテーブルでは0.0.0.0/0に対するターゲットの設定もできて、これが転送先が何も設定されてない時のデフォルトの転送先になる(デフォルトの転送先のことをデフォルトゲートウェイと呼ぶ)。

一般的なネットワーク設計では、ルートテーブルに行うような設定は、ルーターという機器に対して行う。
しかし、AWSではルートテーブルを作成するとルーターに相当するものが自動的に出来上がる。

こうやってルート作るのか

localにすると、同一VPC内のリソースにアクセスできるのか
送信先 10.0.0.0/16
ターゲット local
は、VPC領域のCIDRブロック10.0.0.0/16に含まれるIPアドレス宛のパケットであれば、VPC領域のルータに接続されている相手への通信なので、VPC領域のルーターにパケットを転送するという意味である。
(ネットワークの世界では、自分が所属しているネットワークのことを慣習的にローカルやローカルネットワークと呼ぶ))

awsには外部から攻撃を防ぐファイアフォールとして、セキュリティグループとネットワークACLがある。
セキュリティグループは、AWSリソースにアタッチして利用する仮想ファイアウォールである。
インバウンド(AWSリソースへの通信)とアウトバウンド(AWSリソースからの通信)を制御することができ、許可した通信のみ通過できる。
特定の通信を拒否する設定はできない。
許可の設定をセキュリティグループのルールと呼ぶ。

ネットワークACLはサブネットに設定する仮想ファイアウォールである。
通信制御で拒否を設定できることがセキュリティグループとの大きな違いである。

リソースを作成するということは、それだけ侵入の危険性が高まるということを意味する。
なので、ネットワークの安全性を保ちながらリソース設定できるように踏み台サーバー(中継サーバー)を用意する

大前提、SSHはネットワーク経由でサーバーに安全に接続するためのプロトコル。
(インターネットの向こう側のサーバーにもアクセスできるし、同じネットワーク内のサーバーにもアクセスできる)
DBサーバーはインターネットに接続されてないからssh接続できないのだが、踏み台サーバーにsshでアクセスすれば、あとはDBサーバーへssh接続が許可されていれば、ssh接続でプライベートIP指定したらアクセスできる。
[あなたのPC]
↓(SSH・インターネット経由)
[踏み台サーバー](パブリックサブネット)
↓(SSH・プライベートIPで接続)
[DBサーバー](プライベートサブネット)

各リソースへの接続は、限られた管理者のみが行えるようにすべきだが、
そのような設定を各リソースに対して行うことは大変だし、設定守れば発生する可能性も高くなる
なので、全てのリソースの接続入口となる踏み台サーバーを用意して、このサーバー経由できないとリソースに接続できないようにする方式がよく使われている。

踏み台サーバー自身は、目的のリソースへの通り道となる以外の用途がないので、スペック低くても大丈夫だし、OSも特に問わない

SSHで接続するには、秘密鍵と公開鍵というキーペアを用意する必要がある。

踏み台サーバーって、ec2の画面からキーペア作って、ec2インスタンス作成時にキーペア指定して、sshのセキュリティグループでパブリックサブネットにec2インスタンス配置すれば作れるのか

ssh configのHostnameには数珠繋ぎによって接続されルサーバーの1つ前のサーバーからみた情報を指定する

EC2は仮想サーバーであり、CPU、メモリ、ディスクなどが備えられていて、LinuxやWinなどのOSをインストールできる。

EC2で作成したリソース一つ一つをEC2インスタンスと呼ぶ

キーペアタイプは、キーの暗号化で使われるアルゴリズムを表す。
プライベートキーファイル形式は、プライベートキーが書いてあるファイルの形式を表す。mac, linuxとwindowsで違う

ec2のコンソールから、キーペアを作成できるのか。
作成した瞬間しか秘密鍵は入手できない。

ec2インスタンスを作成するときに、インスタンスタイプを選べる。
インスタンスタイプは、CPU、メモリ、ストレージ、ネットワークキャパシティーの組み合わせで構成されており、t2.microやc5.xlargeのように表記される。
最初のtやcはインスタンスファミリーと呼ばれて、インスタンスの種別を表す
(cなら、高性能なcpuが利用できるコンピューティング最適化。rなら、メモリ内の大きなデータが処理できるメモリ最適化なら等)
次の数字はインスタンス世代を表し、数字が大きいほど、新しい世代。
世代が新しいほど高性能でコストパフォーマンスが高い。
microやxlargeはインスタンスサイズを表していて、大きい方がスペックは高い。
Ec2インスタンス作成後でもこのインスタンスタイプは簡単に変更できる。

Amazon Linux AMI の場合、ユーザー名は ec2-user です。
ec2-userはAmaxon Linux AMIのデフォルトのユーザー名らしい

数字の前に0をつけると8進数になるのか
rwxでr→4, w->2, x->1を表すから、
ssh -i .ssh/aws-hoge/yuki-aws-2.pem ec2-user@52.199.138.65
The authenticity of host '52.199.138.65 (52.199.138.65)' can't be established.
ED25519 key fingerprint is SHA256:NLFnEByo3jaI6xEG9dgpsM/ybinSmYfcyvQNRl7CoZg.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '52.199.138.65' (ED25519) to the list of known hosts.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '.ssh/aws-hoge/yuki-aws-2.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key ".ssh/aws-hoge/yuki-aws-2.pem": bad permissions
ec2-user@52.199.138.65: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
このエラーの原因は、ファイルのパーミッショが緩すぎて、オーナー以外のグループとその他がこの秘密鍵ファイルを参照(4)できてしまうことが問題。
なので以下のコマンドを実行する必要があった。
chmod 400 .ssh/aws-hoge/yuki-aws-2.pem

多くのDBMSでは、ファイルシステム上にデータ保管用のファイル(データファイル)を作成してこれを使います。
なるほど。

ライブラリは「自分のアプリの一部」としてコードに組み込まれる
ミドルウェアは「自分のアプリとは別に動くサービス」で、アプリはそれを外部として扱う

ミドルウェア(英: Middleware)は、コンピュータの分野で、コンピュータの基本的な制御を行うオペレーティングシステム(OS)と、各業務処理を行うアプリケーションソフトウェアとの中間に入るソフトウェアのこと。
通常はオペレーティングシステムの機能の拡張、あるいはアプリケーションソフトウェアの汎用的(共通的)な機能を集めたものである
なるほど。

ロードバランサーなどを設置する場合、webサーバーは間接的に接続されるので、webサーバーはプライベートサブネットに置く。
また、webサーバーとするec2インスタンスのインスタンスタイプは、利用者の数に応じて適切なスペックを選ぶ。

sshの多段接続機能を使わないと、秘密鍵のファイルを踏み台サーバーに置く必要があって、それがセキュリティ的にまずいのか。踏み台サーバーはパブリックipを持っているから、全世界に公開されているし。

多段sshのメリットは、踏み台サーバーからプライベートサーバーにアクセスするときに、ローカルの秘密鍵を使うことができること。
ローカルの秘密鍵ファイルを踏み台サーバーに置く必要がないから、セキュリティ的に安全。

ec2インスタンス立てただけで、webサーバーソフトウェアインストールしてないから、webサーバーではないんだよな。将来的にwebサーバーの役割を持たせるec2インスタンスを立てた感じか

一旦クローズ