QuickSightの埋め込み許可ドメインへ任意のドメインをHTTPで登録出来るようになりました

2022.07.10

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

いわさです。

QuickSightではダッシュボードや分析を外部のWebコンテンツへiframeで埋め込むことが可能です。
以下のブログでこの機能を紹介したことがあります。

QuickSightの外部埋め込み機能では、埋め込み先でコンテンツを表示させるために、埋め込み先ドメインをQuickSight管理画面で登録する必要があります。
登録していない外部サイトへは埋め込むことが出来ないので、許可されていない外部サイトでダッシュボードが不正利用される恐れがありません。

この制限はこれまでは開発中に困るケースがありました。
しかし、先日のアップデートでうまいこと回避出来るようになりましたので紹介します。

どう困っていたのか

特定のダッシュボードの埋め込みURLをSDKで取得し外部Webサイトへ埋め込んだとしても、QuickSightの管理画面で個別のドメインを登録しなければいけないのですが、本番環境やステージング環境以外のドメインを登録出来ない運用になっている場合も多いと思います。

あるいは、一時的なURLの登録を許可出来たとしても、localhostやSSL証明書が導入されていないHTTPエンドポイントで利用することは出来ませんでした。

ここでは ASP.NET Core のトップページにダッシュボードを埋め込み、ローカルでデバッグ実行してみます。

% dotnet new mvc
テンプレート "ASP.NET Core Web App (Model-View-Controller)" が正常に作成されました。
このテンプレートには、Microsoft 以外のパーティのテクノロジが含まれています。詳しくは、https://aka.ms/aspnetcore/6.0-third-party-notices をご覧ください。

作成後の操作を処理しています...
/Users/iwasa.takahito/work/hoge0710qs/hoge0710qs.csproj で ' dotnet restore ' を実行しています...
  復元対象のプロジェクトを決定しています...
  /Users/iwasa.takahito/work/hoge0710qs/hoge0710qs.csproj を復元しました (98 ms)。
正常に復元されました。

Program.cs

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddControllersWithViews();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

// app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

Index.cshtml

@{
    ViewData["Title"] = "Home Page";
}

<div class="text-center">
    <h1 class="display-4">QuickSight Hoge</h1>
    <iframe
        width="960"
        height="720"
        src="https://ap-northeast-1.quicksight.aws.amazon.com/embed/01b649fb828d40de8b325668d396eb41/dashboards/d71ff307-662f-4a2b-9383-499de528300e?code=AYABeBg5P6LsMmkx77jwQLc75pEAAAABAAdhd3Mta21zAFBhcm46YXdzOmttczphcC1ub3J0aGVhc3QtMTozNjcwOTQ1NjE4OTQ6a2V5LzkyZDU3MjEzLTc0MjItNGNhOC1iYWZiLTg2MDFjNGZkODgyNwC4AQIBAHh19lpIdHJLvWmpW7433A8711o_o_2vfnBuxyXbJJdfkwF2PGJFOCHWsSdcC2kRnH3EAAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMSNRkTGQAS4dmOlh-AgEQgDsoGR-8BKR50tYR1B4CMXVOA7tdMHfbqAExoaW_6VP8So8Ra1Dq2npbnA79ekQowrbGc4d2RUSdAuf4WQIAAAAADAAAEAAAAAAAAAAAAAAAAACEnFJTDiIhmL5aJiv0-hqw_____wAAAAEAAAAAAAAAAAAAAAEAAACbu-K8IS7WAQUq-mltCRCLzEDuwE51G3_jeJjMkvq-mddE_puxDQnObecs3R9ZIspCsBhWPrXPXSQjRU8iIUmpLUY11XKrnOdNgwV1ZIKb-T_0xOIxYgmzJYXYUCxvjqK8ZRaua2Nf-jqr57tW0kuicLZ561fdvrSzF7QyQXyYZBs4VsUn58G9h7vs2HCQNkPXLpOEN_ktSOipewIav1dRm-JbvrlF66IZi6R7&identityprovider=quicksight&isauthcode=true">
    </iframe>
</div>

デフォルトで入っているHTTPSリダイレクト設定を無効化し、ここではCLIで埋め込みURLを取得してViewへハードコーディングしてみます。

このような形で、ページ内部のQuickSight埋め込みコンテンツが描画されていません。

埋め込みURL生成時に許可ドメインを指定可能に

埋め込みURLは、GenerateEmbedUrlForAnonymousUserあるいはGenerateEmbedUrlForRegisteredUserで発行するのですが、その際に許可するドメインを3つまで指定することが出来るようになりました。

この機能を使うと、管理者がドメインリストへ登録していない場合や、HTTPエンドポイント、あるいは以前までは許可されていなかったlocalhostを許可リストへ設定して埋め込みURLを発行することが出来ます。

ここでは、dotnet runでローカル実行するケースを想定し、http://localhostを許可リストに指定してURL発行してみましょう。

% aws quicksight generate-embed-url-for-registered-user \
--aws-account-id 123456789012 \
--user-arn arn:aws:quicksight:ap-northeast-1:123456789012:user/default/iwasareader \
--allowed-domains "http://localhost:5226" \
--experience-configuration '{"Dashboard": {"InitialDashboardId": "d71ff307-662f-4a2b-9383-499de528300e"}}' --profile hoge
{
    "Status": 200,
    "EmbedUrl": "https://ap-northeast-1.quicksight.aws.amazon.com/embed/01b649fb828d40de8b325668d396eb41/dashboards/d71ff307-662f-4a2b-9383-499de528300e?code=AYABeBg5P6LsMmkx77jwQLc75pEAAAABAAdhd3Mta21zAFBhcm46YXdzOmttczphcC1ub3J0aGVhc3QtMTozNjcwOTQ1NjE4OTQ6a2V5LzkyZDU3MjEzLTc0MjItNGNhOC1iYWZiLTg2MDFjNGZkODgyNwC4AQIBAHh19lpIdHJLvWmpW7433A8711o_o_2vfnBuxyXbJJdfkwF2PGJFOCHWsSdcC2kRnH3EAAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMSNRkTGQAS4dmOlh-AgEQgDsoGR-8BKR50tYR1B4CMXVOA7tdMHfbqAExoaW_6VP8So8Ra1Dq2npbnA79ekQowrbGc4d2RUSdAuf4WQIAAAAADAAAEAAAAAAAAAAAAAAAAACEnFJTDiIhmL5aJiv0-hqw_____wAAAAEAAAAAAAAAAAAAAAEAAACbu-K8IS7WAQUq-mltCRCLzEDuwE51G3_jeJjMkvq-mddE_puxDQnObecs3R9ZIspCsBhWPrXPXSQjRU8iIUmpLUY11XKrnOdNgwV1ZIKb-T_0xOIxYgmzJYXYUCxvjqK8ZRaua2Nf-jqr57tW0kuicLZ561fdvrSzF7QyQXyYZBs4VsUn58G9h7vs2HCQNkPXLpOEN_ktSOipewIav1dRm-JbvrlF66IZi6R7&identityprovider=quicksight&isauthcode=true",
    "RequestId": "2e8b6add-18ab-4897-8436-c151b18ef7bc"
}

:

% dotnet run
ビルドしています...
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: https://localhost:7194
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: http://localhost:5226
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
      Content root path: /Users/iwasa.takahito/work/hoge0710qs/

ローカル実行時に、埋め込んだダッシュボードを確認することが出来ました。これは捗る。

指定した許可ドメインはどこに登録されるのか

なお、この新たに指定出来るようになった許可ドメインオプションですが、既存の許可ドメイン管理機能とは別のものになっています。
もし、今回の機能で許可ドメインを指定したとしても既存のドメインリストには影響が出ません。

追記: 2022.08.25

本エントリでは当初、全ての HTTP ドメインが許可されるものだと思って記載していましたが、正確には HTTP で許可されるのは localhost のみで、例えば Amazon S3 静的ホスティングなどので非 SSL コンテンツをホスティングしている場合などに利用出来るものではないようでした。

% aws quicksight generate-embed-url-for-registered-user --aws-account-id 123456789012 --user-arn arn:aws:quicksight:ap-northeast-1:123456789012:user/default/cm-hoge/cm-hoge --experience-configuration '{"Dashboard": {"InitialDashboardId": "23269de0-bd37-4176-b970-5089351c235f"}}' --allowed-domains "http://hoge0825qs.s3-website-ap-northeast-1.amazonaws.com/" 

An error occurred (InvalidParameterValueException) when calling the GenerateEmbedUrlForRegisteredUser operation: Input contains invalid domains: [http://hoge0825qs.s3-website-ap-northeast-1.amazonaws.com/]

さいごに

本日は QuickSight で埋め込みダッシュボードを使う際の許可ドメインをURL生成時に指定出来る機能を紹介しました。
開発中の許可ドメインの更新などが煩雑だったなと感じていた方には嬉しいアップデートなのではないかなと思います。

従来のドメインリスト管理機能は本番環境やステージング環境用に引き続き利用し、今回の指定機能は開発中に使うまでに留めるのが良いかなと思いました。
指定出来るのが3つまでとはいえ、どのドメインが許可されているのか管理できなくなりそうな気もします。