ぺい

渋谷系アドテクエンジニアの落書き

AWS備忘録

俺用メモ

業務や勉強で出てきたキーワードやメモを雑にまとめている記事。(随時更新するかも)

VPC

AWS上に好きな構成のネットワークを構築出来る。

使い方
1. VPCのトップへ 2. メニューからVPCを選択する 3. VPCの作成

サブネット

VPCで作成したプライベートなネットワーク空間を、さらにCIDRブロックで分割することが出来る。
10.0.0.6 というCIDRブロックをVPCとして割当たところをさらに /24 の大きさで分割するなど。

10.0.0.0/16(10.0.0.0 ~ 10.0.255.255)
↓ /24 分割
10.0.0.0/24(10.0.0.0 ~ 10.0.0.255)
10.0.1.0/24(10.0.1.0 ~ 10.0.1.255)
色々ある
10.0.254.0/24(10.0.254.0 ~ 10.0.254.255)
10.0.255.0/24(10.0.254.0 ~ 10.0.255.255)

使い方

  1. メニューからサブネット選択
  2. サブネット作成
  3. どこで?とからへん設定する

インターネットゲートウェイ

VPCで作成した領域、サブネットをインターネットに接続する。イメージ的には、自分のネットワークにインターネット回線を引き込む作業。 インターネットゲートウェイを作成して、作成したものにチェックして、VPCにアタッチする。 しかし、このままでは、インターネットに接続が出来ません。具体的にやるべき作業としては、「0.0.0.0/0 の範囲の宛先パケットは、インターネットゲートウェイに転送する」という設定をルートテーブルに設定する。(ルートテーブルについては、別項目で詳しく)ちなみに、0.0.0.0/0 は全てのIPアドレスを指している。つまり、「転送先が何も設定されていないものは、デフォルトの転送先にするという意味になります」これをデフォルトゲートウェイという。

使い方
ルートテーブルにサブネットの追加

  1. ルートテーブル作成
  2. 作成したものを選択
  3. サブネット関連付けを編集
  4. 割り当てしたいサブネット選択する。

ルートを編集(デフォルトゲートウェイ

  1. ルートテーブルを選択
  2. ルートを編集
  3. 別のルートを追加
  4. 0.0.0.0/0とigwから始まるターゲットを設定する

ルートテーブル

TCP/IPのネットワーク機器である「ルータ」が、「宛先IPアドレス」を見て、「もっとも宛先IPあどれすに近い方のネットワーク」へと、パケットを転送して、最終目的地にパケットを到達させてます。この仕組には、ルータが、「どちらのネットワークが、より宛先IPあどれすに近いか」を事前に知っておかないと、うまく機能しません。
実際には、VPCを作った時点で、デフォルトのルートテーブルや、サブネット作成時にデフォルトのルートテーブルが適用されるので、意識しなくてもいい。

確認方法

サブネットから、特定のVPCを選ぶ、ルートテーブルが下に出てきているので、それを押すと、特定のルートテーブル情報が出てくる。下のタブで実際に設定されているルートテーブルが出てくる。

ルートテーブルは以下のような設定を持ちます。

宛先アドレス(ディスティネーション) 流すべきネットワークの入り口となるルーター(ターゲット)

簡単な例
ルータ1が知っているサブネットはCIDR0とCIDR1 ルータ2が知っているサブネットはCIDR2とCIDR3 CIDR0がCIDR3に通信するためには、ルータ1とルータ2を経由する必要がある。

設定する値

ルータ1

ディスティネーション ターゲット
CIDR0 local
CIDR1 local
CIDR2 ルータ2
CIDR3 ルータ2

ルータ2

ディスティネーション ターゲット
CIDR0 ルータ1
CIDR1 ルータ1
CIDR2 local
CIDR3 local

ドメイン名と名前解決

www.example.co.jp -> 54.250.90.112 と解決するやつ

使い方

適当な名前を自動でつける場合

  1. VPC設定ページを開く
  2. 該当のVPCを選択して、アクションを開く
  3. DNSホスト名編集をはいと選ぶ
  4. VPCに紐付いているEC2インスタンのDNSを確認

独自ドメイン名をつける場合

レジストラと呼ばれるドメイン事業者から、利用したいドメイン名を取得する。AWSのコンソールから取得する他にも、JIRSの指定業者から取得も可能。
DNSサーバーを構築するためにRoute 53というサービスが提供されています。これに取得したドメイン名を設定すると独自ドメイン名を利用出来るようになります。ちなみに、このRoute 53を使ってドメイン名を取得することも可能です。

NATゲートウェイ

内側からインターネットは利用したいけど、外部からの接続を避けたい時は、IPマスカレードの機能を利用することで実現出来る。利用ケースとしては、閉じたサブネットからのライブラリとかのインストールは許可したいよねー。けど、外からのアクセスはいらないよねーみたいな。

  1. メニューからNATゲートウェイを選択する
  2. NATゲートウェイの作成
  3. 対象サブネットと適当なElastic IPを割り当てる
  4. ルートテーブルに 0.0.0.0/0 natID を設定。
  5. 閉じたネットワークにいるインスタンスからcurl投げてみる

EC2

EC2を使うことで、仮想サーバーを作成することが出来る。この仮想サーバーのことは「インスタンス」と呼びます。このインスタンスには、サブネット内で利用可能な「プライベートIPアドレス」を割り当てます。しかし、インターネットからの接続にプライベートIPアドレスは使えません。そこで出てくるのが「パブリックIPアドレス」です。AWSで割り当てられているIPアドレスぶろっくのうちの適当なものが使われます。

使い方

  1. インスタンス
  2. インスタンス作成
    1. インスタンス起動する際に使うイメージファイル(AMI)を選択する
    2. インスタンスタイプの選択
    3. インスタンスの詳細の設定 VPCの設定とかする(どこのVPCで?どこのサブネットで?IPアドレスはなに?とかはここらへん)
    4. ストレージの追加
    5. タグの追加 なんか色々ある NameでHogeとかにすると名前つけれる
    6. セキュリティグループの設定 インスタンスにセキュリティ設定する機能
    7. 確認と作成 この時にキーペア作成が出来る

インスタンスの停止と再開について

停止すると課金対象から外れ、コストを下げることが出来る。しかし、インタウンスが使っているストレージのEBSは容量を確保している間は課金対象となります。もし、完全に課金を止めたい場合は削除すれば良いのですが、一度削除したインスタンスは二度と復活しないので気をつけること。

パブリックIPアドレスを固定化する

ElaticIPというのを使えば出来る。

  1. メニューからElasticIPを選ぶ
  2. 新しいアドレスの割り当て
  3. なんか適当にやって、作成
  4. 確保したIPアドレス選択
  5. アドレス関連付け
  6. インスタンス選ぶ

SSHで接続する

今回はパブリックIPアドレスを使ってアクセスする。(Mac環境で)

$HOME/.ssh/config に以下のノリで設定する

Host ec2
   User ec2-user
   Port 22
   Hostname 13.131.219.17
   IdentityFile ~/.ssh/my-key.pem

以下のようなエラーが出たら、chmod 400 keyとかでいける。内容としては他のユーザーでも読めるよねー。うん。みたいなノリ。

$ ssh ec2
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/Users/jumpei/.ssh/my-key.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 "/Users/jumpei/.ssh/my-key.pem": bad permissions
Permission denied (publickey).

$ chmod 400 /Users/jumpei/.ssh/my-key.pem
$ ssh ec2
Last login: Sun Jun 10 12:19:54 2018 from 103.2.241.5

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2018.03-release-notes/
10 package(s) needed for security, out of 12 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-10-0-1-10 ~]$

ファイアウォールで通信を制限する(セキュリティグループ)

パケットフィルタリング
流れるパケットを見て、通過の可否を決める仕組みです。
パケットにはIPアドレスの他、ポート番号やそれに付随するものを見て、通過の可否を決めます。

  • インバウンド 外側から内側へ
  • アウトバウンド 内側から外側へ

使い方
設定内容確認

  1. メニューからセキュリティグループ
  2. 該当のセキュリティグループを選択
  3. インバウンド選択
  4. ルールが見れる

Webサーバの例

  1. インスタンスIPアドレスを取得(パブリックIPとか)
  2. 外部からそのIPアドレスでアクセスしてみる(デフォルトだと22番以外許可されていないから)
  3. インスタンスのセキュリティグループを確認して編集
  4. 今回だと、インバウンドに0.0.0.0/0 に 80番ポートの許可
  5. 2でアクセスしたIPへ再度アクセス

SNS(Simple Notification Service )

SNSはpub/sub メッセージング/モバイル通知サービス。
例えば、YARUO というワードをSNSから送るとこんな感じになる。
これを使って、Lambdaをキックしたり出来る。

{
  "Records": [
    {
      "EventSource": "aws:sns",
      "EventVersion": "1.0",
      "EventSubscriptionArn": "arn:aws:sns:ap-northeast-1:85166933371:HelloWorld:2d9efed1-e6ee-4778-9045-d0ad7e0e4481",
      "Sns": {
        "Type": "Notification",
        "MessageId": "4094aa4b-81fe-5b4c-bbb2-f9233432590",
        "TopicArn": "arn:aws:sns:ap-northeast-1:51669633371:HelloWorld",
        "Subject": "None",
        "Message": "YARUO",
        "Timestamp": "2018-06-12T11:37:33.401Z",
        "SignatureVersion": "1",
        "Signature": "T...b6EHMpgAP3D3usg+DKshVqwL1t74Q==",
        "SigningCertUrl": "https://sns.ap-northeast-1.amazonaws.com/SimpleNotificationService-eaea6120e66ea12e88dcd8bcbddca72.pem",
        "UnsubscribeUrl": "https://sns.ap-northeast-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:ap-northeast-1:85169633371:HelloWorld:2defed1-e6ee-4778-9045-d0ad7e0e4481",
        "MessageAttributes": {}
      }
    }
  ]
}

SMS メッセージには、最大で 160 個の ASCII (または 70 個の Unicode) 文字を含めることができます。 メッセージがこの長さを超える場合、Amazon SNS はそれを複数のメッセージとして送信し、それぞれが文字数の制限以内に収められます。 メッセージは単語の途中ではなく、全単語の境界で切り離されます。

使い方

  1. トピックを作成する
  2. 作ったトピックを選んでサブスクリプション作成すると送信先を増やせる
  3. トピックを発行すると、送信先へメッセージが送られる(実際はコードでやることになることが多い)

CloudWatch

lambdaなどの標準出力をログ取ってくれたり、色々ログ取ってくれるやつ。
アラーム設定で、AutoScallingやSNS通知の発行などが出来る。

AlermのSNSの例
ただ、なんのエラーが起きたかは分からないので、巻き取る方法を作る必要がある。

{
  "Records": [
    {
      "EventSource": "aws:sns",
      "EventVersion": "1.0",
      "EventSubscriptionArn": "arn:aws:sns:ap-northeast-1:851669633371:HelloWorld:2d9efed1-e6ee-9045-d0ad7e0e4481",
      "Sns": {
        "Type": "Notification",
        "MessageId": "ba186730-a68f-534b-ada6-34a9609753de",
        "TopicArn": "arn:aws:sns:ap-northeast-1:851669633371:HelloWorld",
        "Subject": "ALARM: \"lambda-error\" in Asia Pacific (Tokyo)",
        "Message": "{\"AlarmName\":\"lambda-error\",\"AlarmDescription\":\"lambda-error-desc\",\"AWSAccountId\":\"851669633371\",\"NewStateValue\":\"ALARM\",\"NewStateReason\":\"Threshold Crossed: 1 out of the last 1 datapoints [1.0 (12/06/18 12:58:00)] was greater than or equal to the threshold (1.0) (minimum 1 datapoint for OK -> ALARM transition).\",\"StateChangeTime\":\"2018-06-12T13:00:07.954\"}",
        "Timestamp": "2018-06-12T13:00:08.005Z",
        "SignatureVersion": "1",
        "Signature": "LB8YEGkR8QazvxNPBxiwzXF4OUtjJIIiJKiDx5c6PGrvRO1/cHMdSncdEcxy0w==",
        "SigningCertUrl": "https://sns.ap-northeast-1.amazonaws.com/SimpleNotificationService-e.pem",
        "UnsubscribeUrl": "https://sns.ap-northeast-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:ap-northeast-1:851669633371:HelloWorld:2d9efed1-4778-9045-d0ad7e0e4481",
        "MessageAttributes": {}
      }
    }
  ]
}

firehoseと組み合わせると便利っぽい。
サブスクリプションを使用したログデータのリアルタイム処理 - Amazon CloudWatch ログ

SQS(Simple Queue Service)

シンプルなキューサービス。出来るのは、データ投入・取り出し・削除のみ。 命令を作る側と、命令を受け取る側でいい感じに分けれる。

よく使うコマンド

プロセス確認

ps -ax

ポートの状況見る

sudo lsof -i -n -P

名前解決確認

nslookup hoge.com