AWS App Runnerのカスタムドメインリンクを試してみた

2022.02.15

しばたです。

最近App Runnerに入門して色々試しています。
本記事ではApp Runnerで独自ドメインを使うための機能であるカスタムドメインのリンクを試した結果を共有します。

カスタムドメインのリンク

最初にApp Runner環境を作成した状態ではサービスに対し[ランダムID].[リージョン名].awsapprunner.comというホスト名が割り当てられます。

このホスト名に対してHTTPSアクセスすることでアプリケーションを表示できます。

(上図はテスト用の自作アプリケーション)

サーバー証明書は*.[リージョン名].awsapprunner.comなワイルドカード証明書が使われています。

ちなみにgenkiroid/certコマンドで確認するとこんな感じで、CNだけでなくSANも設定されていることがわかります。

C:\> cert k5qxxxxxxxx.ap-northeast-1.awsapprunner.com
DomainName: k5qxxxxxxxx.ap-northeast-1.awsapprunner.com
IP:         xx.xx.xx.xx
Issuer:     Amazon
NotBefore:  2021-04-16 09:00:00 +0900 JST
NotAfter:   2022-05-16 08:59:59 +0900 JST
CommonName: *.ap-northeast-1.awsapprunner.com
SANs:       [*.ap-northeast-1.awsapprunner.com]
Error:

このホスト名では実際のサービスを運用することは厳しいため、カスタムドメインのリンクをすることでユーザーの独自ドメインでApp Runnerサービスを公開してやります。
この機能では独自ドメインの利用とAWS Certificate Manager(ACM)を使ったサーバー証明書の自動発行を行ってくれます。

そしてカスタムドメインのリンクは以下の3パターンの登録方法があります。

  1. 単一ホスト名 (www.example.comなど) に対するリンク
  2. ワイルドカード (*.example.comなど) に対するリンク
  3. 単一ホスト名 + www (example.com + www.example.comなど) に対するリンク
    • 現状APIからのみ設定可能 + 制約あり

それぞれサーバー証明書の発行のされ方が異なり、最初の2パターンでは単一ホスト名に対する証明書およびワイルドカード証明書が発行されます。
最後のパターンでは指定のホスト名に加えwww付きの名前がSANに追加されます。
最後のパターンは現状API(AWS CLIやSDKなど)からのみ設定可能です。

試してみた

それではさっそくカスタムドメインをリンクしてみます。

事前に適当なApp Runner環境を準備した状態がスタート地点です。

1. 単一ホスト名に対するリンク

最初に単一ホスト名に対するリンクを試します。
独自ドメインを使いたいサービスを選び、「カスタムドメイン」タブを選択し「ドメインをリンク」ボタンをクリックします。

すると利用したい独自ドメイン名の入力を促されるので公開したいホスト名を入力し「カスタムドメインをリンク」ボタンをクリックします。

今回は私が保有しているexample.shibata.techドメインでwww.example.shibata.techというホスト名でサービスを公開してみます。

すると次の画面に遷移し、DNSに所定の検証用レコードを登録する様促されれます。

「1.証明書の検証を設定する」にある2レコードがサーバー証明書の検証用です。
72時間以内に画面に表示されている内容のCNAMEレコードを作成してください。
(画面上レコード種別が明記されていませんがCNAMEレコードです。違う種別だとダメなのでご注意ください。)

「2.DNSターゲットを設定する」にあるレコードは公開用です。
デフォルトの[ランダムID].[リージョン名].awsapprunner.comなレコードに対するCNAMEレコードを作成します。

ちなみにマネジメントコンソールの文言ではCNAMEだけでなくALIASレコードも登録できる様に読めますが、現状App Runnerのホスト名はALIASに対応していません。

今回の場合example.shibata.techのDNSはRoute 53で管理しているため、これらのレコードを設定した結果は下図の様になります。

これでリンクの状態が「DNS検証の保留中」になるのでしばらく待ちます。

設定に問題なければステータスがアクティブになります。
(早い場合は1時間くらいで更新されます)

これでhttps://www.example.shibata.tech/にアクセスしてApp Runnerのサービスを表示することができます。

サーバー証明書はwww.example.shibata.techに対するものになっています。

certコマンドの結果はこんな感じです。
用途は不明ですがCN以外にランダムIDが付いたSANが設定されています。

C:\> cert www.example.shibata.tech
DomainName: www.example.shibata.tech
IP:         xx.xx.xx.xx
Issuer:     Amazon
NotBefore:  2022-02-15 09:00:00 +0900 JST
NotAfter:   2023-03-18 08:59:59 +0900 JST
CommonName: www.example.shibata.tech
SANs:       [www.example.shibata.tech 2a57j78f4t3eko8nciavi3cz1xh0u47.www.example.shibata.tech]
Error:

2. ワイルドカードに対するリンク

次に、ワイルドカード証明書を発行したい場合はリンクするドメイン名を*.example.shibata.techの様にワイルドカード指定にするだけです。

後の処理は前項と同様です。
検証用CNAMEレコードをよしなにDNSに登録してください。

ちなみにDNSターゲットの表示が*.example.shibata.techになってしまってますが、これはあくまでもマネジメントコンソールの表示の都合ですので実際のサービスでは公開したいホスト名(www.example.shibata.techなど)を登録してください。

ステータスがアクティブになれば*.example.shibata.techなワイルドカード証明書が発行されます。

certコマンドの結果はこんな感じです。

C:\> cert www.example.shibata.tech
DomainName: www.example.shibata.tech
IP:         xx.xx.xx.xx
Issuer:     Amazon
NotBefore:  2022-02-15 09:00:00 +0900 JST
NotAfter:   2023-03-18 08:59:59 +0900 JST
CommonName: *.example.shibata.tech
SANs:       [*.example.shibata.tech 2a57j78benxk5jdmhbofqdqitbpnrrp.example.shibata.tech]
Error:

3. 単一ホスト名 + wwwに対するリンク

最後に単一ホスト名 + wwwに対するリンクを試します。

このパターンは現状CLIからしか設定できません。
aws apprunner associate-custom-domainコマンドで--enable-www-subdomainパラメーターを付けることでこのパターンを実現できます。

# --enable-www-subdomain パラメーターを付けると SAN に www を増やせる
aws apprunner associate-custom-domain --service-arn "<your service arn>" --domain-name "<your domain>" --enable-www-subdomain

今回のは以下の様な感じでexample.shibata.techドメインのZone APEXを対象としてみました。
https://example.shibata.tech/https://www.example.shibata.tech/のアクセスを意図したよくある設定ですね。

# AWS CLI on PowerShellな環境で実施
C:\> aws apprunner associate-custom-domain --service-arn arn:aws:apprunner:ap-northeast-1:xxxxxxxxxxxx:service/my-first-app-runner/ `
>>     --domain-name "example.shibata.tech" --enable-www-subdomain
{
    "DNSTarget": "k5qxxxxxxxx.ap-northeast-1.awsapprunner.com",
    "ServiceArn": "arn:aws:apprunner:ap-northeast-1:xxxxxxxxxxxx:service/my-first-app-runner/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "CustomDomain": {
        "DomainName": "example.shibata.tech",
        "EnableWWWSubdomain": true,
        "Status": "creating"
    }
}

マネジメントコンソールからリンク状況を確認すると下図の様に検証用レコードが3つに増えています。

それぞれよしなに設定してください。
最終的なサーバー証明書は以下の様になり、CNがexample.shibata.techでSANにwww.example.shibata.techが設定されているのがわかります。

C:\> cert www.example.shibata.tech
DomainName: www.example.shibata.tech
IP:         xx.xx.xx.xx
Issuer:     Amazon
NotBefore:  2022-02-15 09:00:00 +0900 JST
NotAfter:   2023-03-18 08:59:59 +0900 JST
CommonName: example.shibata.tech
SANs:       [example.shibata.tech www.example.shibata.tech 2a57j78f4t3eko8nciavi3cz1xh0u47.example.shibata.tech]
Error:

注意点 : 現状App Runnerのホスト名はALIASに対応していません

最初に述べた通り現状App Runnerのデフォルトホスト名はALIASレコードに対応していません。
このため今回やりたかったZone APEX + www SANのパターンにおいて、Route 53ではZone APEXの設定がうまくできません。

今回はむりやりAレコードを登録して動作確認しましたが本番運用では使えないでしょう。

このパターンはRoute 53以外でZone APEXにうまいことCNAMEを付けられるDNSサーバー *1を使うか、Zone APEXでないホスト名 + wwwとしたい場合に採用する様にしてください。

余談 : AWS Certificate Managerの設定画面

App Runnerのカスタムドメインリンク機能は内部的にACMを使っていることは明白なのですが、ACMの管理画面側からは一切情報を参照できません。
あくまでもApp Runnerの「カスタムドメイン」からのみ参照可能となってます。

そのせいかACMのCloudWatch Metricsも存在せず証明書の管理は完全にブラックボックスとなっています。
App Runnerではユーザー持ち込みの証明書を使う事もないのでここは大きな問題にはならないでしょう。

最後に

以上となります。
簡単ですがApp Runnerのカスタムドメインリンクを試してみました。

個人的にはApp RunnerがまだRoute 53のALIASレコードに対応していないことにちょっと驚きでした。
このため若干ですが制約がありますのでご注意ください。

脚注

  1. そんなものあるのかな?