マネジメントアカウントで取得したドメインの静的ウェブサイトをメンバーアカウントから CloudFormation を使用して Cloudfront + S3 + Certificate Manager で構築する

静的ウェブサイトが必要になった経緯

個人開発している Web サービスで決済機能として Stripe を導入予定です。同社の審査は大きく分けて「本人証明」と「ビジネス証明」の 2 つがあり、後者で特商法のページが必要になります。この特商法のページを静的なウェブサイトとして構築するのが本記事の主旨となります。

設計

基本的には S3 の静的ウェブサイト機能 を使用します。ただし、S3 の同機能は HTTPS に対応していないので前段に Cloudfront + Certificate Manager を設置する必要があります。使用する AWS はサービスは以下になります。

サービス 用途 リソースを所有するアカウント リソースを作成するアカウント AWS Organizations の OU
Route53 ドメイン取得, DNS 管理 マネジメントアカウント メンバーアカウント OU: Infrastructure/Pord/website-prd
S3 オブジェクトストレージ マネジメントアカウント メンバーアカウント OU: Infrastructure/Pord/website-prd
Cloudfront CDN マネジメントアカウント メンバーアカウント OU: Infrastructure/Pord/website-prd
Certificate Manager SSL 証明書管理 マネジメントアカウント メンバーアカウント OU: Infrastructure/Pord/website-prd

AWS Organizations のベストプラクティス に則り OU: Infrastructure/Prod/website-prd という メンバーアカウント で構築します。

本来であれば上記のリソースはマネジメントアカウントではなくメンバーアカウントに所有させたかったのですが、構築に AWS から提供されている CloudFormation のテンプレートである amazon-cloudfront-secure-static-site を使用しているため *1 、このような設計としています(ベストプラクティス上はマネジメントアカウントは 同アカウントで必要な最小限のリソースのみを所有するのみにとどめ、ほとんどのリソースはメンバーアカウントが所有する ことが推奨されていますが、これは数少ない例外かもしれません)

今回はメンバーアカウントからマネジメントアカウントの強めの権限を設定した Role に Switch Role して CloudFormation を実行しています。具体的には以下のような設定になります。

マネジメントアカウント > IAM

  1. マネジメントアカウントの IAM で Role: ManagementAccountAdministrator を作成する。同 Role には AWS Managed Policy: AdministratorAccess を付与する。Trusted relationships としてメンバーアカウントを Principal に追加する。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<account_id_of_member_account>:root"
            },
            "Action": "sts:AssumeRole",
            "Condition": {}
        }
    ]
}

マネジメントアカウント > IAM Identity Center

  1. メンバーアカウントの IAM Identity Center の Permission Set: Administrator *2 に Inline Policy でマネジメントアカウントで作成した Role: ManagementAccountAdministrator への STS 権限を付与する。
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "PrivilegeEscalationToManagementAccountAdministrator",
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Resource": "arn:aws:iam::<account_id_of_management_account>:role/ManagementAccountAdministrator"
    }
  ]
}

以下は IAM Identity Center で管理している User: kyagi がメンバーアカウント: B の Adminitrator グループからマネジメントアカウント: A の Role: ManagementAccountAdministrator にスイッチした例です。

スイッチ前のマネージメントコンソロールのヘッダです。

スイッチする時のダイアログです。

スイッチ後のマネージメントコンソロールのヘッダです。

実装

S3 を使用した静的ウェブサイト構築については AWS にドキュメントが用意されています。S3 発のドキュメントCloudfront 発のドキュメント があります。設定をひとつひとつ確認しながらマニュアルで進めるなら前者ですが、ここでは Cloudformation のテンプレートを紹介している後者を使用しています。

このテンプレートではドメインを取得したアカウントの Route53 から取得した HOSTED ZONE ID を入力として求められます。またリージョンは us-west-1 を想定した実装になっています。私の場合、Route53 のドメイン取得はマネジメントアカウントで管理するようにしているので、ここでは上記で言及したようにメンバーアカウントからマネジメントアカウントに switch role して CloudFormation を実行しています。

所感

一口に、特商法のサイトを構築すると言っても、なかなか手間がかかることがわかりました。今回は AWS から提供されている CloudFormation のテンプレートを使用したのでだいぶ楽でしたが手動で設定する場合はめんどくさそうです。

特商法のサイトに載せるべき主な情報をクラウドサービスに対応させると以下になります。所在地の記載は DMM バーチャルオフィスを契約予定です。

ID 項目 説明 クラウドサービス
1 所在地 事業所の住所(登記簿上の住所)*個人事業主の場合は「請求があったら遅滞なく開示します」で省略可。 〒123-4567 東京都渋谷区○○町○○丁目12-3 DMM バーチャルオフィス
2 電話番号 顧客からの日本語の問い合わせに対応できる電話番号*個人事業主の場合は「請求があったら遅滞なく開示します」で省略可。 03-1234-5678 受付時間 10:00-18:00(土日祝を除く) DMM バーチャルオフィス、もしくは、専用のスマフォ + SIM
3 メールアドレス 顧客からの問い合わせに対応できるメールアドレス contact@example..jp AWS Workmail

参考情報

「特定商取引法に基づく表記」ページの作成方法

静的ウェブサイト構築

*1:同テンプレートが要求する Route53 の hosted zone id がドメインを取得したアカウントを想定しているため

*2:個人的に IAM Identity Center における Group, Permission Set, Predefined Policy の設定は こちら