雑記: AWS にカフェ (アプリケーション) を開店準備するまで

人生で、新しく配属された組織が AWS の知識を前提にしていることがあると思います。でも用語が多いと思います。なので同じ境遇の方のためにカフェに喩えました。お気づきの点がありましたらご指摘いただけますと幸いです。
なお、長くなってしまったのでパブリックサブネットの NAT ゲートウェイやロードバランサの話はないです。

まとめ

  • VPC: あなたが初めて AWS 国にカフェ (アプリケーション) を建設するとき、まずつくる町です (つくらなくてもデフォルトでつくられますが)。16~65536 区画 (IP アドレス数) の広さの町をつくることができます。
    • サブネット: 町の中の丁目です。なお、各丁目の 2 区画目には自動的にタクシー乗り場 (VPC ルータ) が建設されます。
    • ルートテーブル: 各タクシー乗り場に設置されている、「そこからある目的地 (送信先) に行くとき、次の経由地 (ターゲット) はどこか」を示すガイドブックです。ここに登録がない目的地には行けません。
  • EC2 インスタンス: カフェの建物 (仮想マシン) です。建てたい丁目 (サブネット) に、建てたい構造・広さ (Amazon マシンイメージ・インスタンスタイプ) の建物を建設します。
    • セキュリティグループ: 建物のセキュリティシステムに登録するルールです。
      • インバウンドルール: 建物外から建物内に入ってくる人の通行許可です。
      • アウトバウンドルール: 建物内から建物外に出張に行く人の出張許可です。
    • IAM ロール: その建物から AWS 国の公共機関を利用してよいかの許可です。
  • SSM AgentAWS 国の公共サービスとして、建設した建物についてくる管理人ロボです。建設したカフェの内装工事 (開発作業) をするとき、インバウンドルールに自分を追加して自分で建物に入ってやる方法 (SSH 接続など) も、建物にいる管理人ロボに代わりにやらせる方法 (セッションマネージャー経由の接続) もあります (通常後者の方法を取ります)。
  • Systems Manager (SSM): 管理人ロボを派遣している AWS 国の公共機関です。あなたがこの機関の受付窓口 (セッションマネージャー) に内装工事の指示を送り、他方、管理人ロボが定期的にカフェがある丁目の支所から秘密の地下通路でこの機関に指示を確認しに出張することで (ポーリング)、便利で安全に内装工事ができます。
  • VPC エンドポイント: その丁目で AWS 国の公共機関を利用したいとき、その丁目内に誘致する支所です。なんと秘密の地下通路 (PrivateLink) で本部とつながっています (インターフェイス型の場合)。

  1. IPアドレスとCIDR表記の理解:AWSでのネットワーキング - Qiita:人はまず VPC を作成しようとして「10.0.0.0/16 って何」となると思います。このページをみて事なきを得ました。
  2. 【VPC/サブネット】AWSによる予約IPアドレスについて - エムトラッドブログ:1. の記事に「最初の4つと最後の1つのIPアドレスAWSによって予約されています」とあってとても気になると思います。このページをみて事なきを得ました。
  3. ステップ 2: VPC エンドポイントを作成する - AWS Systems Manager:最初プライベートサブネットをルートテーブルでインターネットゲートウェイにつないでしまっていたので (台無し)、たぶんそのせいでこの設定をしなくてもセッションマネージャーに接続できていました。わかりません。正しくはこの設定をするはずです。この設定をしてセッションマネージャーで接続できるようになるのに少しタイムラグがあって焦りました。
  4. VPCエンドポイント ってなんのこと? - Qiita:本当になんのことなので助かりました。
  5. セッションマネージャー越しにSSHアクセスすると何が嬉しいのか | DevelopersIO:セッションマネージャー経由時にどうなっているのかわからなかったので参考にしました。

以下、ストーリー本編です。

町 (VPC) をつくる
あなたは AWS 国の入国ビザ (アカウント) を得ました。あなたは AWS 国にカフェを開業したい (アプリケーションをたてたい) です。そのためには、まず町 (VPC) をつくります。VPC ダッシュボードに移動し、「VPC を作成」を押下します。

  • 「作成するリソース」で「VPC など」を選択します。
    • 本当にただ町をつくるだけなら「VPC のみ」でよいですが、町をつくるときにその中に何丁目をつくるかと、各丁目のタクシー乗り場から出るタクシーはどこに行けるのか書き込むガイドブックもつくっておくと便利だと思います。
  • IPv4 CIDR ブロック」であなたの町の大きさを指定します。ただし、以下の決まりがあります。
    • 町の大きさは 16 区画~ 65536 区画 (10.0.0.0/28 ~ 10.0.0.0/16) の広さを指定することになっています。この区画ごとに住所 (IP アドレス) があります。なお、10.0.0.0/n という表記は 2 の 32-n 乗の区画数を表します。
    • ただし、町の中をさらに丁目 (サブネット) に分ける場合は、1 つの丁目が最低 16 区画必要です。町全体が 1 つの丁目でも構いませんが、以下のような場合には丁目を分けます。
      • 例えば、あなたの町の中に「町の外から直接入ってこれる丁目 (パブリックサブネット)」と「そうでない丁目 (プライベートサブネット)」があるような設計にしたいならば、そこで丁目を分けます。
      • 例えば、停電でカフェが全く営業できなくなるリスクに備えて地域ごとに依存する発電所を分けてカフェを分散したい (複数データセンターにアプリケーションをデプロイしたい) ならば、ある一つの発電所に依存する丁目 (アベイラビリティゾーン) ごとに丁目を分けます。これは設計思想というか仕組み上分けざるをえません。
  • つまり、あなたの町を、アベイラビリティゾーン数が 2 で、それぞれにパブリックサブネットとプライベートサブネットがあるようにしたいなら、丁目の数は 4 になり、ゆえに町全体の大きさは最低 64 区画必要です。
  • あなたは防犯上町の外から直接入れない丁目にカフェを建設したく、また停電時にまで営業を続行したい事情はなかったので、町の大きさを 32 区画 (10.0.0.0/27) とし、最初の 16 区画 (10.0.0.0/28) を 1 丁目とし、次の 16 区画 (10.0.0.16/28) を 2 丁目とし、それぞれパブリックサブネット、プライベートサブネットとして運用することにしようとしました。
    • なお、各丁目の最初の 4 区画と最後の 1 区画には AWS 国の決まりで自動的に公共施設が建てられるなどします (以下)。なので、それらの区画にはあなたのカフェは建設できません。
      • 最初の区画は、そこの住所 (IPアドレス) が特別な意味をもつ (その丁目の識別に利用される) ので (ネットワークアドレス)、そこには慣例的に施設を建設しません。
      • 2 番目の区画には、タクシー乗り場 (VPC ルータ) が建設されます。なお、AWS 国で移動するときは必ずタクシー乗り場からタクシーに乗らなければならず、タクシー乗り場に設置されているガイドブック (ルートテーブル) にない目的地には行けません。ルートテーブルについてはこの記事の最後の方が再度触れます。
      • 3 番目の区画には、AWS 国の各種公共サービス機関 (AWS リソース) の住所を調べられる案内所 (Amazon DNS サーバ) が建設されます。
      • 4 番目の区画はなんか念のため施設を建設することが禁止されています。
      • 最後の区画は、そこの住所がその丁目内のすべての区画の住所のエイリアスになるという特殊な意味をもつので (ブロードキャストアドレス)、施設は建設できません。

建物 (EC2 インスタンス) を建てる
あなたの町ができたらそこにカフェの建物 (EC2 インスタンス) を建てます。EC2 ダッシュボードに移動し、「インスタンスを起動」を押下します。

  • Amazon マシンイメージ」「インスタンスタイプ」は建物の構造と広さのようなものです。あなたのカフェで利用したい設備が導入できる or 既に備わっている構造を選び、その設備に期待する価値を発揮できるくらいの広さを選ぶと思います。これはあなたのカフェで提供したいサービスや、見込んでいる来店客数に依存します。
  • 「ネットワーク設定」の「VPC」「サブネット」は建物を建てる町・丁目です。先ほどつくった VPC とその中のプライベートサブネットを選びます。
  • 「ネットワーク設定」の「セキュリティグループ」は建物のセキュリティシステムに登録するルールです。後からでも変更できます。
    • 「インバウンドルール」は「建物外から建物内に入ってくる人の通行許可」です。「お店のこの入口に (ポート) 、この住所からやって来た (ソース)、こんな作法 (プロトコル) の人なら通してよいです」というようなルールを複数登録できます。
      • 例えば、カフェの内装工事 (開発作業) のために自分も建物に入りたい場合、自分 (の IP アドレス) が作業員として (TCP 接続で) 作業員入口 (22 番ポート) から入ってくることを許可するルールを追加します。ただし、実際には設計思想上プライベートサブネットにこのようなルールは追加せず、建物に公共サービスとして派遣されている管理人ロボ (SSM Agent) に代わりに作業させます。
      • また、カフェの開店前に自分がお客様としてお店のサービスを確認したい場合、自分 (の IP アドレス) がお客様入口 (例えば 5000 番ポートへの TCP 接続) から入ってくることを許可するルールも追加しておきます。ただし、実際には設計思想上プライベートサブネットにこのようなルールは追加せず、同じ町内のパブリックサブネットのロードバランサを通って来た人だけを許可します。
    • 「アウトバウンドルール」は「建物内から建物外に出張に行く人の出張許可」です。
      • デフォルトではどこにでも出張に行けます。あなたがカフェに必要な資材をあらゆる場所から調達したいなら、どこにでも出張に行けるようにした方がよいと思います。そうでなく、「この工場のコーヒー豆の仕入れのみ許可する」などとしたいときはそのようなルールを追加すると思います。
  • 「高度な詳細」内にある「IAM インスタンスプロフィール」には「IAM ロール」を設定します (両者の違いはここでは割愛します)。後からでも変更できます。「IAM ロール」とは、その建物から AWS 国の公共機関を利用してよいかの許可です。
    • 例えば、その建物の管理人ロボ (SSM Agent) に代わりに内装工事をさせる場合、管理人ロボが派遣元の公共機関 (SSM) に工事指示を確認しに行くことを許可する IAM ロール (AmazonEC2RoleforSSM) を設定する必要があります。

建物の管理人ロボ (SSM Agent) に内装工事指示を出す
建物が建ったら早速内装工事 (開発作業) をしたいと思います。例えば、インバウンドルールに自分を追加して自分で建物に入って工事することができます。ただ、この方法だとルールや鍵 (SSHキー) の管理が面倒だし、もしあなたのカフェに共同運営者が加わったらルールを追加したり鍵を渡したりがやっぱり面倒だし、そもそも、「カフェがある丁目は町の外から直接入れないようにしよう」としていたのに自分が直接入っていては設計思想と反しています。

なので、往々にして建設した建物に常駐している管理人ロボ (SSM Agent) に作業してもらいます。AWS 国で建てた建物にはなんと公共サービスとして勝手にこのロボが付いてきます。このロボはあなたの身代わりとしてあなたそっくりに動いてくれます。

しかし、疑問があると思います。このロボにどうやって指示を送るのでしょうか。あなたがロボに会いに行くならば、「カフェがある丁目は町の外から直接入れない」に反すると思います。ロボに会いに来てもらうにせよ、ロボは指示通りに動くのだから、実質「直接入れない」に反しています。

しかし、ロボは公共機関 (SSM) から派遣されているので、特別で安全な経路で町の外に情報を取りに行くことができます。具体的に、ロボに作業してもらうためには、あなたのカフェがある丁目内に SSM の支所 (VPC エンドポイント) を誘致します。その支所はなんと秘密の地下通路 (PrivateLink) で本部でつながっています。ロボはここを通って、あなたが本部の窓口 (セッションマネージャー) に出した指示を定期的に確認しに来ることができます。

  • 再び VPC ダッシュボードに移動します。やりたいことは公共機関の支所 (VPC エンドポイント) を誘致することなのですが、支所のセキュリティシステムにも、あなたのカフェからロボが指示を確認しにやって来ることを許可させないといけません。そこで、先にセキュリティシステムに登録するルール (セキュリティグループ) を作成します。サイドバーから「セキュリティグループ」を選択、「セキュリティグループを作成」を押下し、インバウンドルールに、「タイプ=HTTPS、 ソース=あなたのカフェのセキュリティグループ (あなたのカフェの IP アドレスでもよいがセキュリティグループによる指定が推奨されている)」を追加します。
  • いよいよ支所を追加します。サイドバーから「エンドポイント」を選択します。画面右上の「エンドポイントを作成」を押下し、サービスの検索フォームに .ssm と入力することで com.amazonaws.[リージョン名].ssm を探し当て選択します。続けてあなたのカフェの VPC とサブネットを選択し、最後に「セキュリティグループ」でさっきつくったセキュリティグループを選択してエンドポイントを作成します。
  • com.amazonaws.[リージョン名].ssmmessages, com.amazonaws.[リージョン名].ec2, com.amazonaws.[リージョン名].ec2messages に対しても同様に作成する必要があります。個々の支所の役割は割愛します。

ここまで作業して、EC2 インスタンスの IAM インスタンスプロフィールに AmazonEC2RoleforSSM が含まれていれば、EC2 インスタンスの「接続」を押下しセッションマネージャータブから接続できるようになっています (接続できない場合はエンドポイント作成からタイムラグがあるので少し待ってみます)。接続したコンソールでカフェの内装工事 (開発) をします。カフェに直接入って工事をしているような感覚ですが、ストーリーの都合上、これは機関の窓口でロボに指示を送っているのだと思います。

町の外部 (インターネット) から資材を搬入できるようにする

(あなたがまだサブネットのルートテーブルを適切に設定していない場合) 工事を始めてすぐに、外部から資材を搬入できない (パッケージをインストールできない) ことに気づきます。アウトバウンドルール上はどこにでも出張しに行けるようになっているのにです。それは、「この住所に資材を取りに行こう」として丁目のタクシー乗り場に行っても「そこの住所に向かう方法が登録されていないです」となっているためです。タクシー乗り場にあるガイドブックに目的地を登録する必要があります。

  • ルートテーブル: 各丁目のタクシー乗り場に設置されている、「その丁目からある目的地 (送信先) に行くとき、次の経由地 (ターゲット) はどこか」を示すガイドブックです。ガイドブックに登録されていない目的地には行けません。その町内の住所については「町内なので直接向かってください (local)」と必ず登録されています (削除することはできません)。町外の住所にも行けるようにしたい場合は、例えば町外のすべての住所 (0.0.0.0/0) について「次は『インターネットゲートウェイ』タクシー乗り場に向かってください」と登録します。そうすると、そこからまた町の外へ向かう道路 (インターネット) にガイドされることになります。
    • ただし、プライベートサブネットのルートテーブルでは、直接インターネットゲートウェイに向かわせるのは設計思想に反するので、NAT ゲートウェイに向かうようにします。

完成したカフェに訪問してみる

Elastic IP アドレスを EC2 インスタンスに紐づけ、インバウンドルールでアプリケーションがたっているポートへの自分の IP のアクセスを許可すれば仕上がりを確認できます。ただ、プライベートサブネットにパブリックな Elastic IP アドレスを紐づけるのはもう台無しです。実際には、パブリックサブネットにロードバランサを設置してそこを通ってアプリケーションにアクセスするようにします。