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

メールアドレスの@のうしろは、組織が管理するドメイン(あるいはサブドメイン)が使われる。そして、@より前の部分には、組織で重複しないIDが割り当てられる。

SMTPもPOP3もアプリケーション層のプロトコル
SMTPが送信者のクライアントから受信者のドメインのメールサーバーにメールを送信するためのプロトコル(インターネットを経由してる)で、POP3が受信者のクライアントから受信者のドメインのメールサーバーにリクエストしてメールを取得するプロトコル

ここに詳しいことのってる

MX(Mail eXchanger)レコードは、メールアドレスのドメインに紐づくメールサーバーのドメインの対応関係を管理している。

メールアドレスの@の後ろに書くドメインが、example.comだとして、メールサーバーが実際にその宛先にメールを送るときに、dnsサーバーにリクエストして、mxレコードを参照して、そのドメインに対応するメールサーバーのドメインを入手して、そのドメインからさらにdnsサーバーからipアドレスを取得して、メールサーバーにsmtpプロトコルでメールを送信してる。

メールサーバーが宛先にメールを送信する際の流れを整理すると:
1. 宛先メールアドレスの確認
- user@example.comの@以降のexample.comを取得
2. MXレコードの問い合わせ
- DNSサーバーにexample.comのMXレコードを問い合わせ
- 応答例:mail.example.com (優先度: 10)
3. Aレコード(IPアドレス)の問い合わせ
- DNSサーバーにmail.example.comのAレコードを問い合わせ
- 応答例:192.168.1.100
4. TCP接続とメール送信
- 取得したIPアドレス192.168.1.100のポート25にTCP接続
- SMTPプロトコルでメールを送信

実際にメールアドレスを送るときのドメインは、mailとかついてると書くのめんどいから、mailつけてないただのドメインで良くて、裏側でメールを送るときは、mail.とついてるサーバーの方が管理しやすいから、そうなってた方が良い。

SMTPサーバーはメールアドレスの「@」以降の部分であるドメイン名ごとに存在しており
なるほど

- AmazonSES(Amazon Simple Email Service)は、メールの送受信を行う機能を提供するAWSのマネージドサービスである。
- 通常のメールサーバーと用途が少し異なり、人ではなくアプリでメールを送受信するのに都合が良い機能が用意されている。

通常のメールサーバーでは、まず組織に属する多数のユーザーをメールサーバーに登録する。そしてそのユーザーがメールサーバーにSMTPで接続してメールを送信する。
接続する時には、ユーザーがIDトパスワードを手入力する。

アプリからSESを使ってメールを送る時、IAMユーザーを使ってメールを送信する

SESを経由してメールを送ることはできる。
SESを経由してメールを受信することもできるが、SESはPOP3やIMAP4などのプロトコルを用意してないので、代わりにアクションと呼ばれる処理を実行する必要がある。

SESが東京リージョンで利用できるようになっったのは、2020年7月から。割と新しい。
受信機能を使いたい場合、受信も対応しているかは要チェック

SESのリソースを作成した初期時点では、そのリソースはサンドボックスの中に置かれる。
サンドボックスの外にリソースを移動するには、AWSのサポートセンターにリクエストを送る必要がある。

SESのリソースは、VPCの外のリージョンに対して作る

Amazon SESの「ID」とは、ドメイン(サブドメイン含む)とメールアドレスの総称になります。
なるほど

DKIMは、「DomainKeys Identified Mail」の略称であり、「ディーキム」と読みます。送信者がメールに電子署名を付与し、受信者が署名の検証を行うことで、メールの内容がメール作成時点(オリジナル)から改竄されていないことを検証する仕組みです。
なるほど

dkimとかの設定はデフォルトで行われていて、id詳細見て、route53にレコードを作るみたいなのをクリックしたら、検証が完全に終了した。

sesがサンドボックスの中にいるとき、検証済みのメールアドレスにしかメールを送受信できない。

no-replayのドメインをチェックして、テストEメールの送信押して、あとは送信先のメールアドレス(検証済み)を指定すると、そのメールアドレスにメールを送れる。

アプリからメールを送る方法は、2つあって、
- Amazon SES APIを使う
- Amazon SES SMTPインターフェースを使う

smtp認証情報の作成から、アプリからsesを使うときに使うIAMユーザーを作れる。
このユーザーはユーザーグループに入っていて、このユーザーグループにsesを使ってメールを送信できるIAMポリシーが付与されている
AmazonSesSendingAccess
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "ses:SendRawEmail",
"Resource": "*"
}
]
}

sesのコンソールからsmtp認証設定を追加すると、smtpサーバーとして使える

さっき作ったiamユーザー名とsmtpユーザー名って違うのか。
このsmtpユーザー名を認証で使う。
これでアプリからemail送るのできた。
accountとpasswordはsmtpのやつ
serverはsmtp設定画面のsmtpエンドポイント
# -*- coding: utf-8 -*-
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email import charset
# 各種情報
account = '*****'
password = '*****'
server = '*****'
from_addr = 'no-reply@*****'
to_addr = '*****@*****'
# SMTPサーバーに接続する
con = smtplib.SMTP(server, 587)
con.set_debuglevel(1)
con.starttls()
con.login(account, password)
# 送信するメールのメッセージを作成する
cset = 'utf-8'
message = MIMEText(u'SMTPのテスト!', 'plain', cset)
message['Subject'] = Header(u'SMTP経由での電子メール送信のテストです!', cset)
message['From'] = from_addr
message['To'] = to_addr
# メールを送信する
con.sendmail(from_addr, [to_addr], message.as_string())
# SMTPから切断する
con.close()

nsレコードとsoaレコードよくわからんから後で調べる

キャッシュとは、時間のかかる処理で得たデータを保存して、次に同じ処理をする際には、保存済みのデータを使って素早く結果を返す仕組みのこと

時間に応じて変化するデータとかの場合は、自動でキャッシュのデータが更新されるわけではないから、キャッシュのデータに有効期限を設定しておいた方が良い

キャッシュの実装としては、RedisとMemcachedが有名

RedisとMemcachedはいずれもミドルウェアとして提供されているので、ec2インスタンスのLinuxサーバーにインストールしてキャッシュサーバーとして動作させることができる。しかし、その場合、MySQLなどを直接インストールした時と同様、運用やコスト面で問題が生じる。
AWSではRedis/Memcachedと互換性のあるElastiCache(Amazon ElastiCache)というマネージドサービスが用意されてる。
ElastiCacheはRedisやMemcachedが導入された環境を提供している。

ElastiCacheはあるキーに対してキャッシュされたデータを返すキーバリュー型の仕組みを提供している。
しかし、内部では、扱うデータ量や種類に応じてパフォーマンスを上げるための構成が用意されている。

ElasticCacheを構築する際に、ノード、シャード、クラスターを選択できる。
ノードは、ElasticCacheの最小単位。キャッシュされるデータが実際に保存される場所を確保する。
ノードごとにキャッシュエンジン(Redis/Memcached)、スペック、容量などを設定できる。
シャードは、1~6個のノードで構成されている。ノードは1つのプライマリーノードと複数のレプリカノードで構成されている。
クラスターは複数のシャードで構成されている。マルチAZ機能を使って、複数のアベイラビリティゾーンに分散している。

あんま実感はないが、メモリはSSDやHDDの何十、何百倍の処理速度らしい。

elasti cacheから次やる。

sshで踏み台サーバーにパブリックipでアクセスできる理由は、igwがパブリックipをプライベートipに変換しているから。そのプライベートipで対象のサーバーが存在するサブネットにアクセスしている。

ルーターはルートテーブルを見て、送られてきたipがどのcidrブロックに含まれているかを確認して、ターゲットに転送している。

踏み台できたから、natgateway構築して、そのあとrails入れる

natgatewayでelastic ip使うのだけど、natgateway削除しても残るから、そこは気をつけた方が良い。

yumとは、LinuxのRedHat系ディストリビューション(例:CentOSやFedoraなど)で利用されるパッケージ管理ツールである。

sudoコマンドを使うことで一時的に管理者権限で実行できる

sudo chown deploy-user:deploy-user /var/www → /var/wwwディレクトリ自体のみ変更。
suはswitch user
su - userで、そのユーザーとして新しくログインした状態としてユーザーを切り替えることができる。
sudo su - deploy-user
[deploy-user@ip-10-0-77-219 ~]$ ls
[deploy-user@ip-10-0-77-219 ~]$ whoami
deploy-user
[deploy-user@ip-10-0-77-219 ~]$

dnfとは、Linuxのソフトウェアパッケージを管理するためのプログラムで、「Dandified YUM」の略です。Red Hat系Linux(例: Fedora, CentOS, Amazon Linuxなど)で使われるYUMの後継で、パッケージのインストール・アップデート・削除などを効率的・高速に実行できるよう設計されています。
なるほど

ruby-buildとは、あらゆるバージョンのrubyを簡単にインストールするためのコマンドラインユーティリティ
rbenvのinstallコマンドは、rbenvプラグインとしてのruby-buildが提供している
ruby-buildってそういう意味だったのか。
rubyをインストールするためのやつだったのか

OpenSSLは、誰でも無料で使えるオープンソースソフトウェアとして提供されており、サーバー管理者や開発者が安全な通信環境を構築・管理する際に使います。コマンドラインから操作できるシンプルな構造でありながら、実は非常に多機能で、世界中のさまざまなシステムに組み込まれている定番ツールです。具体的には、以下のような処理を担っています。
データの暗号化と復号化
送信した内容を読み取られないようにするための仕組みです。
公開鍵と秘密鍵の生成
安全な通信を実現するための公開鍵・秘密鍵ペアや共通鍵の作成を行います。
デジタル証明書の作成と管理
デジタル証明書の作成(自己署名証明書やCSRの生成)や管理を行います。
SSL/TLSプロトコルの実装を提供
SSL/TLSプロトコルの実装を提供し、Webサーバやメールサーバなどで安全な通信を実装を提供します。
色々入ってるな。

死活監視とは、サーバーやその上で実行されているソフトウェアの稼働状況を継続的にチェックすることを指します。
なるほど。死活監視は、サーバー or サーバーの上で実行されているソフトウェアが動かなくなってないか継続的にチェックすること。

最低限この項目だけは監視した方が良い。
- 死活監視
- cpu使用率
- メモリ使用率
- ディスク容量
- ネットワークトラフィック

CPU使用率が100%の状態がずっと続いている場合、実行を待つ処理が増えてくる。ずっと100%が続いているのが問題。

メモリはリソースが処理を実行するときに使用する作業場所のようなもの。
メモリには限りがある。
メモリには限りがあるので空きがなくなると、そのプログラムは実行できなくなって待たされるか、Out of Memory的なエラーが出て失敗するか

トラフィックは、インターネット、企業ネットワーク、または任意のネットワーク上で送受信されるデータの量や流れを指します。
なるほど

ディスクについて

ディスクには以下の情報が保存される
- 大きく増加することのないもの:サービスを構築するプログラムや設定ファイルなど
- 時間が経つにつれて増加するもの:サービスに登録されるデータやログなど。
ディスク容量が足りなくなると、保存されるべき情報が保存されなくなり、サービスが異常終了したりする原因となる。

クライアントは、ネットワークを経由してリソースに入ってくる。
リソースがネットワークを介してやりとりできるデータ量には上限がある。
たくさんのユーザーが同時に接続したり、一人のユーザーが大量のデータをダウンロードすると、他のユーザーはリソースと通信しづらい状況になる。
この状態になるとユーザーからすると、ネットワークが混在していて、サービスが使えないという状況になる