ヤマムギ

growing hard days.

*

RDS + VPC + Lambda + API Gateway + CloudFront + WAF + ACMでAPIを構築する

      2016/06/27


RDSのMySQLの情報を与えられたリクエストをキーにしてjsonで返すAPIを構築してみます。
条件としてHeaderのAuthorizationキーの設定と接続元のIPアドレスを制限します。
通信はSSLを使用するのでACMで無料証明書を発行します。

cdp-1

Lambda用のIAMの設定

Lambda実行用にIAMロールを作成します。

ポリシーは「AWSLambdaVPCAccessExecutionRole」をアタッチします。
sles-1

Lambdaの設定

事前にセキュリティグループを1つ作成しておきます。
特にInbound , Outboundの設定は必要ありません。

作成したIAMロールを設定します。
sles-2

RDSと同じVPC、Subnetsを選択します。
SecurityGroupsは事前に作成していたものを設定します。
sles-3

コードは割愛しますが、pythonでMySQLへの接続はpymysqlモジュールを使用しています。
ホスト名はRDSエンドポイントです。

RDSのセキュリティグループの設定

Lambdaに設定したセキュリティグループをインバウンドでMySQLタイプで設定します。
sles-4

API Gatewayの設定

Lambdaの[API endpoints]から作成します。
Securityでは「Open with access key」を設定します。
sles-5

API GatewayでAPIキーを設定して作成されたステージへ追加します。
sles-6

APIで受けるリクエストをメソッドリクエストで設定します。
sles-7
sles-8

統合リクエストでマッピングテンプレートも設定しておきます。
sles-9
sles-91

クエリーパラメータは「”key”: “$input.params(‘key’)”,」です。
コード内ではIPアドレスの制御はしませんが、sourceIpで接続元IPアドレスを一応取得しています。

API Gatewayでは設定が終わってステージに反映するときは必ず、[アクション]-[APIのデプロイ]を実行します。
これをしなければAPIには反映されません。
sles-92

WAFの設定

Web ACL name , CloudWatch metric nameを任意で設定します。
sles-94

Create conditionsで[IP match conditions]と[String match conditions]を設定します。

IP match conditionsでは許可するIPアドレスを設定します。
sles-95

String match conditionsではHeaderのAuthorization値を完全一致で決めます。
sles-96

Create RuleでconditonにIPアドレスとString match conditionを[does]で追加します。
sles-97
sles-98

作成したルールをAction をAllow、Default をBlockとしてACLに追加します。
sles-99

ACMのためのSESの設定

サブドメインのCNAMEにCloudFrontのDomain Nameを任意の設定して独自ドメインにしたいと思います。

※ドメイン管理者としてメールを受信できる場合はこの設定は必要ありません。

※先にCNAMEを設定するとACMの認証URL受け取りのメールのためのMXレコードが設定できなくなるのでCNAMEは最後に設定します。

[Verify a New Domain]で受信したいドメインを指定します。
ses-1

TXTレコードとMXレコードの設定内容が表示されるので、レコードセットを管理しているDNSサーバで設定します。
ses-2

[Create Receipt Rule]で新しいルールを作成します。
[Recipient]にドメインを入れます。(ドメイン宛のメールすべて対象とします。)
ses-3

[Action]でS3バケットを選択します。
2つ目は[Stop Rule Set]として処理を終了しておきます。
ses-4

ルール名を任意で設定します。
ses-5

CloudFrontでのACMの設定

CloudFrontの編集画面で[Request an ACM certificate]をクリックします。
acm-1

ドメイン名を入力します。
acm-2

ドメイン管理者にメールが送信されます。
メールが受信できなくて前述のSESで設定している場合はS3バケットにメールが届いているのでAcceptします。

証明書が発行済になりました。
acm-3

CloudFrontのAlternate Domain Names(CNAMEs)に独自ドメインを入れて、
[Custom SSL Certificate]を選択して発行済の証明書を設定します。

cf-acm

その他のCloudFrontの設定

作成したWAFをCloudFrontへ設定します。
sles-991

Origin Settingsで、Origin Domain NameにAPI Gatewayのエンドポイントを設定します。

[Origin Protocol Policy]は[HTTPS Only]にします。

[Origin Custom Headers]でAPI Gatewayで設定したアクセスキーを設定します。
[Header Name]は[x-api-key]です。
これでAPI Gatewayの直接実行を防止します。
sles-992

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.」とかになります。
sles-993

[Forward Query Strings]も[Yes]にします。
こうしとかないとクエリーストリングパラメータをAPIに渡せません。
forward_query_string

これでWAFで許可していないIPアドレスや、Headerの設定がない場合は、「Request blocked.」になります。

@yamamanx

開発ベンダー5年、ユーザ企業システム部門通算9年、ITトレーナー1年目のSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。

このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。

また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。

 - AWS , , , , , ,

ad

ad

  関連記事

EC2のAMIとRDSのスナップショットを他のAWSアカウントに共有してブログサイトをAWSアカウント間で引っ越す

当ブログで使用しているEC2とRDSを環境の整理のため、他のAWSアカウントへ引 …

WordPressをAmazon CloudFrontで配信してついでにACM(AWS Certificate Manager)を使って常時SSL化する

当サイトの500と502の発生状況がドイヒーであるとの苦情をいただきまして、Am …

リザーブドインスタンスはじめました

このブログも2014年9月にはじめたので、もうすぐ3年。 1件~17件とばらつき …

slackのbotにWikipediaを調べてもらう(Python on AWS Lambda + API Gateway)

slackのbotに少しでも役に立ってもらおうと、Wikipediaを調べてもら …

kintoneに登録されたアカウントの電話番号にGoogleカレンダーの予定をAmazon Pollyが読み上げてTwilioから電話でお知らせする(AWS Lambda Python)

Google Calendar Twilio Reminder Googleカレ …

AWS Well-Architected フレームワークによるクラウド ベスト プラクティスのセッションを聞いたので自アカウントの環境を確認してみる

AWS Summit Tokyo 2017で「AWS Well-Architec …

Amazon LinuxのNginx+RDS MySQLにレンタルWebサーバーからWordPressを移設する(失敗、手戻りそのまま記載版)

勉強のためブログサイトを長らくお世話になったロリポップさんから、AWSに移設する …

Amzon Linux のApacheでRedmineとWordPressをバーチャルホストで共存する

EC2とRDSを節約しようと思いまして、Redmineを動かしてるとこに検証用W …

「雲勉 第1回【勉強会:新技術好き!】AWSマネージドサービス勉強会」に行ってきました

「雲勉 第1回【勉強会:新技術好き!】AWSマネージドサービス勉強会」に行ってき …

Amazon Pollyを使って覚えたい資料を耳から身体に染み込ませる

Amazon Pollyを使うとソースコードを一切かかなくても、テキストを音声に …