RDS + VPC + Lambda + API Gateway + CloudFront + WAF + ACMでAPIを構築する
2016/06/27
RDSのMySQLの情報を与えられたリクエストをキーにしてjsonで返すAPIを構築してみます。
条件としてHeaderのAuthorizationキーの設定と接続元のIPアドレスを制限します。
通信はSSLを使用するのでACMで無料証明書を発行します。
目次
Lambda用のIAMの設定
Lambda実行用にIAMロールを作成します。
ポリシーは「AWSLambdaVPCAccessExecutionRole」をアタッチします。
Lambdaの設定
事前にセキュリティグループを1つ作成しておきます。
特にInbound , Outboundの設定は必要ありません。
作成したIAMロールを設定します。
RDSと同じVPC、Subnetsを選択します。
SecurityGroupsは事前に作成していたものを設定します。
コードは割愛しますが、pythonでMySQLへの接続はpymysqlモジュールを使用しています。
ホスト名はRDSエンドポイントです。
RDSのセキュリティグループの設定
Lambdaに設定したセキュリティグループをインバウンドでMySQLタイプで設定します。
API Gatewayの設定
Lambdaの[API endpoints]から作成します。
Securityでは「Open with access key」を設定します。
API GatewayでAPIキーを設定して作成されたステージへ追加します。
APIで受けるリクエストをメソッドリクエストで設定します。
統合リクエストでマッピングテンプレートも設定しておきます。
クエリーパラメータは「”key”: “$input.params(‘key’)”,」です。
コード内ではIPアドレスの制御はしませんが、sourceIpで接続元IPアドレスを一応取得しています。
1 2 3 4 5 |
{ "key": "$input.params('key')", "sourceIp" : "$context.identity.sourceIp" } |
API Gatewayでは設定が終わってステージに反映するときは必ず、[アクション]-[APIのデプロイ]を実行します。
これをしなければAPIには反映されません。
WAFの設定
Web ACL name , CloudWatch metric nameを任意で設定します。
Create conditionsで[IP match conditions]と[String match conditions]を設定します。
IP match conditionsでは許可するIPアドレスを設定します。
String match conditionsではHeaderのAuthorization値を完全一致で決めます。
Create RuleでconditonにIPアドレスとString match conditionを[does]で追加します。
作成したルールをAction をAllow、Default をBlockとしてACLに追加します。
ACMのためのSESの設定
サブドメインのCNAMEにCloudFrontのDomain Nameを任意の設定して独自ドメインにしたいと思います。
※ドメイン管理者としてメールを受信できる場合はこの設定は必要ありません。
※先にCNAMEを設定するとACMの認証URL受け取りのメールのためのMXレコードが設定できなくなるのでCNAMEは最後に設定します。
[Verify a New Domain]で受信したいドメインを指定します。
TXTレコードとMXレコードの設定内容が表示されるので、レコードセットを管理しているDNSサーバで設定します。
[Create Receipt Rule]で新しいルールを作成します。
[Recipient]にドメインを入れます。(ドメイン宛のメールすべて対象とします。)
[Action]でS3バケットを選択します。
2つ目は[Stop Rule Set]として処理を終了しておきます。
ルール名を任意で設定します。
CloudFrontでのACMの設定
CloudFrontの編集画面で[Request an ACM certificate]をクリックします。
ドメイン名を入力します。
ドメイン管理者にメールが送信されます。
メールが受信できなくて前述のSESで設定している場合はS3バケットにメールが届いているのでAcceptします。
証明書が発行済になりました。
CloudFrontのAlternate Domain Names(CNAMEs)に独自ドメインを入れて、
[Custom SSL Certificate]を選択して発行済の証明書を設定します。
その他のCloudFrontの設定
作成したWAFをCloudFrontへ設定します。
Origin Settingsで、Origin Domain NameにAPI Gatewayのエンドポイントを設定します。
[Origin Protocol Policy]は[HTTPS Only]にします。
[Origin Custom Headers]でAPI Gatewayで設定したアクセスキーを設定します。
[Header Name]は[x-api-key]です。
これでAPI Gatewayの直接実行を防止します。
Behaivior Settingsで[Viewer Protocol Policy]は[HTTPS Only]にします。
[Allowed HTTP Methods]は実行許可するAPIメソッドを含むように選びます。
ここで間違えていると、「This distribution is not configured to allow the HTTP request method that was used for this request.」とかになります。
[Forward Query Strings]も[Yes]にします。
こうしとかないとクエリーストリングパラメータをAPIに渡せません。
これでWAFで許可していないIPアドレスや、Headerの設定がない場合は、「Request blocked.」になります。
最後までお読みいただきましてありがとうございました!
「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。

「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第3版」という本を書きました。

「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。

「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。

「AWSではじめるLinux入門ガイド」という本を書きました。


開発ベンダー5年、ユーザ企業システム部門通算9年、ITインストラクター5年目でプロトタイプビルダーもやりだしたSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
このブログは経験したことなどの共有を目的としており、手順や結果などを保証するものではありません。
ご参考にされる際は、読者様自身のご判断にてご対応をお願いいたします。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
ad
ad
関連記事
-
-
DS18B20センサー+Raspberry Piで取得した温度をAmazon Kinesis FirehoseからS3へ格納してAthenaでクエリーしたのをQuickSightで可視化する
JAWS DAYS 2017でやりますハンズオンの「[IoTハンズオン] Ras …
-
-
CloudWatch LogsをIPv6アドレスを使用して送信する
このブログの構成からパブリックIPv4を減らすように設計変更しています。 もとも …
-
-
Kinesis Data AnalyticsをKinesis Data Streamsに接続してSQL検索する
Amazon Kinesis Data StreamsにTwitter検索データ …
-
-
AWS認定SAPの執筆開始にあたって環境を構築しました
AWS認定ソリューションアーキテクトプロフェッショナル対策本の執筆開始にあたりま …
-
-
ヤマムギ vol.9 (AWS)EC2からAWS CLIコマンドを実行してみようハンズオン 手順
このブログは2020/5/5に開催しました、「ヤマムギ vol.9 (AWS)E …
-
-
S3インベントリ設定でインベントリファイルの作成を設定
インベントリレポートファイルはオブジェクトの一覧情報です。 日次、週次で定期作成 …
-
-
Amazon VPCのAmazonProvidedDNSとほかメモ
VPCユーザーガイドのAmazon DNS について理解するの記載内容について実 …
-
-
AWS Expert Online at JAWS-UG首都圏エリアに参加して「Amazon EC2 スポットインスタンス再入門」を聞いてきた
AWS Expert Onlineという勉強会がありまして、AWS ソリューショ …
-
-
AWS GlueでAurora JDBC接続でS3へのジョブを実行
Aurora Serverless v1のMySQLタイプデータベースからS3へ …
-
-
「JAWS-UG朝会 #18」で主にAWSなブログについて発表をしました
ラジオ体操 いつものラジオ体操から。 今日はラーニングセンターから配信の日でした …