みなさんこんにちは
今年の3月からIoT担当となった中村です。
自宅のスマートホーム化を進めたり、ブリを開発したり、業務中にTwitterを6時間してたら、突然の異動宣告を受けました。
見られていないと思って好き勝手にやっていたら、意外と見られていたようです。
本題
さて、今日はElasticsearch Service(以下ES)にIP制限をかけるお話です。
ESのEndpointはアクセス制限をIAM Policyで定義することが可能です。
ESの画面ではテンプレートが幾つか用意されていて、AWSアカウントによる制限、IPアドレスによる制限などがあります。
今回の記事では、ESへのアクセスをIPアドレスで制限する方法について説明します。
いきなりですが、Policyはこのような感じになります。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "1", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "es:*", "Resource": "arn:aws:es:ap-northeast-1:xxxxxxxxxxxx:domain/fish/buri/recipe/*", "Condition": { "IpAddress": { "aws:SourceIp": [ "xxx.xxx.xx.xx", "yyy.yy.yy.yyy", "zz.zzz.zz.zz" ] } } } ] }
このPolicyでは、「xxx.xxx.xx.xx」「yyy.yy.yy.yyy」、「zz.zzz.zz.zz」のIPアドレスから、fish Domainのburi Indexのrecipe Fieldにアクセスすることができるようになっています。
Indexをburiで指定しているため、もしfish Domainがburi Index以外のIndexを持っていたとしてもこのPolicyではアクセスすることはできないようになっています。
逆に、Resourceを「"arn:aws:es:ap-northeast-1:xxxxxxxxxxxx:domain/fish/*"」のようにすれば、fish Domainが持っている全てのIndexにアクセスすることができます。簡単ですね。
番外編: LambdaからESのEndpointを叩きたい…!
番外編として、もう一つこんなケースを用意してみました。
LambdaからESにクエリを投げたいけど、LambdaのIPアドレスが不定だからIP制限ができない…。
こんな時は、最近リリースされたVPCリソースにアクセス可能なLambdaと、NAT Gatewayを使うのも手です。
VPCリソースにアクセス可能なLambdaとは、Lambda用のENIをVPC内に設置することで、LambdaからVPC内のリソースにアクセスできるようになった少し格好いいLambdaです。
Lambdaの設定項目から、配置するVPC、Subnet、ENIに付与するSecurityGroupを選択することで簡単に利用可能です。
NAT Gatewayとは、その名の通りAWSによるマネージドNATサービスです。NAT GatewayのGlobalIPには、EIPを設定します。
この2つを組み合わせると、Lambdaがインターネットに出て行く時NAT Gatewayを経由して出て行く事になり、結果的にLambdaのIPアドレスをNAT GatewayのIPアドレスに固定することができます。この環境を簡単に図にしてみました。
これにより、ESのPolicyにNAT GatewayのIPアドレスを記載しておけば、Lambdaからアクセスできるようになるわけですね。
NATはEC2インスタンスで代用することも可能ですが、Lambda、ESとNoEC2構成できているので、NATもNAT Gatewayを使ってクールにいきましょう!