![見出し画像](https://assets.st-note.com/production/uploads/images/70199797/rectangle_large_type_2_1b8728830cfd48c831f6f06c4a091c1c.png?width=1200)
AWS ネットワークACL設定ではまった話
こんにちは。NOBORIの水澤です。
弊社のサービスではインフラにAWS/GCPなどのクラウドサービスを利用しています。
構築するのも解体するのもなんともお手軽。
機器を用意しなくて良いってステキです。
でも、インフラって難しくないですか?
一度はまるとなかなか解決できなくて困り果ててしまうみたいな。。
先日そんな事態に陥ったので、その内容を紹介します。
事の始まり
舞台はAWS。
新規機能開発のため、ネットワークを構築中でした。
ちょうどこのような環境。
![](https://assets.st-note.com/img/1642507560594-HPGImYn7u6.png?width=1200)
外部サービスを利用する都合上、外からの接続は固定IPを割り振ったNLBからVPC Endpointに接続し、PrivateなAPI Gatewayに接続するようになっています。
API GatewayのバックエンドはLambdaとなっていて、VPCの中に閉じている配置となります。
設定を変えないといけなくて
実はこの環境では不十分で、外部サービスを使用する上で外部からアクセスしてくるIPアドレスのみをアクセス可能としておく必要がありました。
通常であればセキュリティグループで制御したいところですが、
外部から入ってくる部分はNLBとなっているため、セキュリティグループでの管理ができません。
そのため、ネットワークACL(ネットワークアクセスコントロールリスト)のインバウンドのルールにアクセス可能なIPアドレスを追加することで制御しようとしました。
Amazon Virtual Private Cloud - ネットワークACL
LambdaからDynamoDBの値が取得できない
ネットワークACLのインバウンド設定に外部サービスのIPアドレス、VPCで設定したIPv4 CIDRブロックを許可するように登録したところ、LambdaからDynamoDBにアクセスして、値を取得することができなくなりました。
おぉ、、どうして・・??
DynamoDBはVPCの中にいないもんね
なるほど。そうですよね。
API Gatewayと同じようにDynamoDBにもVPC Endpoint経由でアクセスするんだね。
ということで、VPC Endpointを設定してもアクセスできない。
どういうことなのか・・?頭から煙が出そう。
ネットワークACLはステートレス
前述のAWSドキュメントをお読みの方はお分かりかと思いますが、ネットワークACLはステートレスとなっています。
よって、リクエストとレスポンスの通信はそれぞれ別々に評価されます。
DynamoDBからのレスポンスがネットワークACLのインバウンド設定にマッチしないので、Lambdaで値を受け取ることができませんでした。
AWS IP アドレスの範囲
https://ip-ranges.amazonaws.com/ip-ranges.json
DynamoDBのIPアドレスをネットワークACLのインバウンドに設定することで、無事にLambdaからDynamoDBの値を受け取れるようになりました。
セキュリティグループはどうなの?
セキュリティグループはステートフルの評価となっています。
そのため、アウトバウンドでの通信が許可されていれば、そのレスポンスも自動的に許可されます。
ネットワークACLとは大きく違いますね。
また、ネットワークACLではサブネットグループ単位での設定であることや、拒否ルールも設定できるところなどがセキュリティグループと異なる部分です。
下記サイトの説明がわかりやすかったです。
DynamoDBへのアクセスはインターネット経由になるの?
一息ついたところでさらなる疑問が。
DynamoDBのIPアドレスってグローバルIPでした。
それって、DynamoDBにアクセスするときはインターネット経由ってこと?
S3、SQS、SESなどなど、、VPC内に配置しないものにはインターネット経由でアクセスしているのでしょうか?
答えは「AWSのパブリックIP間の通信はプライベート接続となる」です。
※中国リージョンは異なります。
AWSのFAQに記載があります。
Q:2 つのインスタンスがパブリック IP アドレスを使用して通信する場合、またはインスタンスがパブリックな AWS のサービスエンドポイントと通信する場合、トラフィックはインターネットを経由しますか?
いいえ。パブリック IP アドレスを使用する場合、AWS でホストされているインスタンスとサービス間のすべての通信は AWS のプライベートネットワークを使用します。AWS ネットワークから発信され、AWS ネットワーク上の送信先を持つパケットは、AWS 中国リージョンとの間のトラフィックを除いて、AWS グローバルネットワークにとどまります。
さらに、データセンターとリージョンを相互接続する AWS グローバルネットワークを流れるすべてのデータは、安全性が保証された施設を離れる前に、物理レイヤーで自動的に暗号化されます。すべての VPC クロスリージョンピアリングトラフィックや、カスタマーまたはサービス間のトランスポート層セキュリティ (TLS) 接続などといった追加の暗号化レイヤーもあります。
おわりに
今回はネットワークACLの一部を紹介しました。
ネットワークについては目に見えず、確認がしにくいので難しさを感じています。
試行錯誤しながらそのときに応じた最適解にたどり着けるよう努力あるのみ!!
あと、公式ドキュメントは目を通すべきですね。教訓です。