プライベートなAmazon API GatewayのREST API でカスタムドメインをクロスアカウントで設定してみた
クラウド事業本部の木村です。
以前までプライベートなエンドポイントタイプではカスタムドメインをAPI Gatewayに対して直接設定できないため、実現するために前段にALBなどを配置してプロキシさせる冗長な構成が必要でした。これがカスタムドメインを導入する際のハードルとなっており、私自身も費用や管理コストの観点からカスタムドメインの導入を諦めたという経験がありました。
これが昨年の11月に行われたアップデートによりプライベートなAPI Gatewayに対してもカスタムドメインの設定が可能になり簡単にカスタムドメインを紐づけることができるようになりました。
今回はクロスアカウントでカスタムドメインを利用したAPI Gatewayの接続を行う機会がございましたので設定方法を説明できればと思います。
アカウント内で完結するプライベートなAPI Gatewayの接続については以下で紹介されておりますのでこちらをご参照ください。
設定概要
以下のように接続元と接続先が異なるAWSアカウントでの検証を行っていきます。
図内ではインスタンスとしておりますが、構築内の検証ではVPC内にCloudShellの環境を作成して疎通を行っていきます。
今回の構築ではAPI Gatewayの構築は割愛します。mockで testok
と返すようにだけ設定しています。
構築
VPCエンドポイントの作成(接続元アカウント)
まず接続元のアカウントにてVPCエンドポイントを作成します。
パブリックなAPI Gatewayへの接続に影響しないように、 DNS 名を有効化
のオプションは外しておきます。
セキュリティグループの設定はVPCのCIDRからHTTPSのインバウンドを許可したものを設定、ポリシーはフルアクセスを許可します。
VPCエンドポイントが作成できたら、後ほど利用するのでVPCエンドポイントIDを控えておくようにしてください。
続いてVPC内から今回接続するカスタムドメインを名前解決できるようにRoute 53にてプライベートホストゾーンの設定を行なっていきます。今回対象となるVPCに関連付けるようにホストゾーンを作成してください。
ホストゾーンが作成できたら、今回必要なレコードを登録していきます。
この際先ほど作成したVPCエンドポイントを指定するようにしてください。
これにてVPC関連の接続元アカウントでの設定は完了です。
API Gatewayのカスタムドメイン設定(接続先アカウント)
続いて接続先のアカウントでの、API Gatewayのカスタムドメイン設定を行なっていきます。
まず対象となるAPIGatewayのリソースポリシーを編集します。
先ほど控えておいた、VPCエンドポイントID等を適宜編集して保存してください。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "arn:aws:execute-api:*:123456789012:APIGatewayのID/*",
"Condition": {
"StringNotEquals": {
"aws:sourceVpce": "先ほど作成したVPCエンドポイントID"
}
}
},
{
"Effect": "Allow",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "arn:aws:execute-api:*:123456789012:APIGatewayのID/*",
"Condition": {
"StringEquals": {
"aws:sourceVpce": "先ほど作成したVPCエンドポイントID"
}
}
}
]
}
この際の注意点として、リソースポリシーを編集しただけでは設定は保存されません。
編集後には必ずステージングするようにしてから疎通確認を行ってください。
次にカスタムドメイン関連の設定を行なってきます。API Gatewayのページから「カスタムドメイン名」を選択してください。
「ドメイン名を追加」からカスタムドメインを追加します。
今回はルーティングモードはAPIマッピングのみで進めていきます。
ACM証明書は以前から作成してあるワイルドカード証明書を利用します。未作成の場合は以下を参照の上作成して設定を行なってください。
作成できたら、マッピングを行います。作成済みのAPIgatewayにマッピングを設定します。
続いてカスタムドメインのリソースポリシーを編集します。
デフォルトでは全てをDenyするようになっているので、接続したい対象にAllowを行いましょう。今回は検証用のリソースなので全てに対してAllowを設定します。
接続を行うためには「ドメイン名アクセスの関連付け」が必要なのですが、こちらは接続先のアカウントでは設定が行えず接続元のアカウントにて設定が必要となります。
私はこのことに気付けずかなりの無駄な時間を過ごしてしまいました。
接続先のアカウントで設定しようとすると以下のようにエラーになります。
接続元のアカウントでカスタムドメインのARNが必要になるので、この際控えておくようにしましょう。
接続元のアカウントで設定を行うために、RAMでリソースの共有を行います。
RAMの画面に移動して「リソース共有の作成」を選択してください
リソースタイプにて「API Gateway Private Custom Domain」を選択して、今回作成したリソースを選択してください。
マネージド型アクセス許可を関連付けるについてはそのままの設定でOKです。
続いて共有する先のアカウントを追加していきます。今回は組織外のアカウントなので「すべてのユーザーとの共有を許可」を選択して接続元のAWSアカウントIDを入力して追加を選択してください。(組織内での共有の場合は承諾の手間がなくなりますので、組織内を選択してください。)
すると下部分に対象のAWSアカウントが追加されますので、確認したら「次へ」を選択してください。
内容を確認して問題なければ、リソース共有を作成してください。
これにて接続先の設定は終了になります。
ドメイン名アクセスの関連付け(接続元アカウント)
続いて接続元のアカウントに戻って作業を行います。
まずはRAMにて共有の許可を行います。作成した共有を選択してリソース承認を承諾してください。
承諾したら続いてAPI Gatewayの画面を遷移して「ドメイン名アクセスの関連付け」を選択し、「ドメインの関連付けを作成」を押下してください。
控えておいたARNと作成したVPCエンドポイントを選択して、関連付けを作成します。
これで設定は完了になります。
疎通確認
では接続元のアカウントから疎通を確認してみます。
というわけで想定したメッセージが返ってきましたので、これにて検証は以上としたいと思います。
(※関連付けしてすぐに実施すると関連付けが完了しておらず、うまくいかないケースがございます。数分おくと成功する場合がありますので、エラーになった場合は少し時間を空けて試してみてください。)
さいごに
今回はプライベートREST API でカスタムドメインをクロスアカウントで設定してみました。以前カスタムドメインを関連付けできず困った経験があったのでプライベートなAPI Gatewayでもカスタムドメインできる機能はとても便利だと思いました。
検証の際いくつかの箇所でつまづいてしまい予想以上に検証に時間がかかったことからこの記事を作成しております。この記事でみなさまの構築時間が短縮につながれば幸いです。
クラウド事業本部の木村がお届けしました。