1. 主要ページへ移動
  2. メニューへ移動
  3. ページ下へ移動

QES ブログ

記事公開日

最終更新日

【AWS】AWS CloudFormationを利用したAmazon DataZone環境構築

  • このエントリーをはてなブックマークに追加

はじめに

こんにちは。DXソリューション営業本部の後藤です。
本記事では、AWSのデータ管理サービスであるAmazon DataZoneの環境をAWS CloudFormationを利用して自動構築する方法についてご説明したいと思います。

Amazon DataZoneとは

Amazon DataZone は、AWS、オンプレミス、およびサードパーティのソースに保存されているデータのカタログ化、検出、共有、ガバナンスをより迅速かつ簡単に行うことができるデータ管理サービスです。Amazon DataZone を使用すると、組織のデータアセットを監督する管理者は、きめ細かなコントロールを使用してデータへのアクセスを管理および統制できます。引用元:https://docs.aws.amazon.com/ja_jp/datazone/latest/userguide/what-is-datazone.html


今回行いたいこと&構成図

今回行いたいこと

・CloudFormationを利用してDataZone環境を構築する。

・Glue Crawlerでテーブルを作成する。

・サブスクライブを行ってプロジェクト間でデータを共有できるようにする。

構成図

スクリーンショット 2025-01-20 165818.png

今回使用するCloudFormationテンプレート

DataZone環境を構築するテンプレートを以下のように作成しました。<テンプレートを表示>からコード部分をコピペし、拡張子をyamlとして任意のファイル名(UTF-8 BOMなし形式)で保存してください。
DataZone環境作成用テンプレート(クリックしてテンプレートを表示)
AWSTemplateFormatVersion: '2010-09-09'
Description: createdatazone

Parameters:
  # アカウントID
  AccountId:
    Type: String
    Default: ""

  # リージョン
  Region:
    Type: String
    Default: ""

  # S3バケットパス
  S3BucketPath:
    Type: String
    Default: ""

  # IAMUser
  IAMUser:
    Type: String
    Default: ""

  # ドメイン実行用ロール名
  DomainExecutionIAMRoleName:
    Type: String
    Default: ""

  # GlueACCESS管理用ロール名
  GlueAccessIAMRoleName:
    Type: String
    Default: ""

  # Provisioning用ロール名
  ProvisioningIAMRoleName:
    Type: String
    Default: ""

  # ドメイン名
  DataZoneDomainName:
    Type: String
    Default: ""

  # 管理用プロジェクト名
  DataZoneProject1Name:
    Type: String
    Default: ""

  # 分析用プロジェクト名
  DataZoneProject2Name:
    Type: String
    Default: ""

  # 環境プロファイル名
  DataZoneEnvironmentProfileName:
    Type: String
    Default: ""

  # 管理用環境名
  DataZoneEnvironmentName1:
    Type: String
    Default: ""

  # 分析用環境名
  DataZoneEnvironmentName2:
    Type: String
    Default: ""


Resources:
  # ドメイン実行用ロール
  DomainExecutionIAMRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service: "datazone.amazonaws.com"
            Action:
              - "sts:AssumeRole"
              - "sts:TagSession"
            Condition:
              "StringEquals":
                "aws:SourceAccount": !Ref AccountId
              "ForAllValues:StringLike":
                "aws:TagKeys": "datazone*"
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AmazonDataZoneDomainExecutionRolePolicy
      RoleName: !Ref DomainExecutionIAMRoleName

  # GlueACCESS管理用ロール
  GlueAccessIAMRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service: "datazone.amazonaws.com"
            Action: "sts:AssumeRole"
            Condition:
              "StringEquals":
                "aws:SourceAccount": !Ref AccountId
              "ArnEquals":
                "aws:SourceArn": !Sub "arn:aws:datazone:${Region}:${AccountId}:domain/*"
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AmazonDataZoneGlueManageAccessRolePolicy
      RoleName: !Ref GlueAccessIAMRoleName
    DependsOn: DomainExecutionIAMRole

  # Provisioning用ロール
  ProvisioningIAMRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service: "datazone.amazonaws.com"
            Action: "sts:AssumeRole"
            Condition:
              "StringEquals":
                "aws:SourceAccount": !Ref AccountId
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonDataZoneRedshiftGlueProvisioningPolicy
        - arn:aws:iam::aws:policy/AmazonS3FullAccess
      RoleName: !Ref ProvisioningIAMRoleName
    DependsOn: GlueAccessIAMRole

  # ドメインを作成
  DataZoneDomain:
    Type: AWS::DataZone::Domain
    Properties:
      DomainExecutionRole: !GetAtt DomainExecutionIAMRole.Arn
      Name: !Ref DataZoneDomainName

  # 管理用プロジェクト作成
  DataZoneProject1:
    Type: AWS::DataZone::Project
    Properties:
      DomainIdentifier: !Ref DataZoneDomain
      Name: !Ref DataZoneProject1Name

  # 分析用プロジェクト作成
  DataZoneProject2:
    Type: AWS::DataZone::Project
    Properties:
      DomainIdentifier: !Ref DataZoneDomain
      Name: !Ref DataZoneProject2Name

  # LakeFormation管理者にIAMUserを追加
  DataLakeAdmins:
    Type: AWS::LakeFormation::DataLakeSettings
    Properties:
      Admins:
        - DataLakePrincipalIdentifier: !Sub "arn:aws:iam::${AccountId}:user/${IAMUser}"

  # ブループリントの作成
  DataZoneEnvironmentBlueprintConfiguration:
    Type: AWS::DataZone::EnvironmentBlueprintConfiguration
    Properties:
      DomainIdentifier: !Ref DataZoneDomain
      EnabledRegions:
        - !Ref Region
      EnvironmentBlueprintIdentifier: DefaultDataLake
      ManageAccessRoleArn: !GetAtt GlueAccessIAMRole.Arn
      ProvisioningRoleArn: !GetAtt ProvisioningIAMRole.Arn
      RegionalParameters:
        - Parameters:
            S3Location: !Ref S3BucketPath
          Region: !Ref Region

  # 環境プロファイルの作成
  DataZoneEnvironmentProfile:
    Type: AWS::DataZone::EnvironmentProfile
    Properties:
      AwsAccountId: !Ref AccountId
      AwsAccountRegion: !Ref Region
      DomainIdentifier: !Ref DataZoneDomain
      EnvironmentBlueprintIdentifier: !GetAtt DataZoneEnvironmentBlueprintConfiguration.EnvironmentBlueprintId
      Name: !Ref DataZoneEnvironmentProfileName
      ProjectIdentifier: !GetAtt DataZoneProject1.Id
    DependsOn: DataZoneEnvironmentBlueprintConfiguration

  # 管理用環境の作成
  DataZoneEnvironment1:
    Type: AWS::DataZone::Environment
    Properties:
      DomainIdentifier: !Ref DataZoneDomain
      EnvironmentAccountIdentifier: !Ref AccountId
      EnvironmentAccountRegion: !Ref Region
      EnvironmentProfileIdentifier: !GetAtt DataZoneEnvironmentProfile.Id
      EnvironmentRoleArn: !GetAtt ProvisioningIAMRole.Arn
      Name: !Ref DataZoneEnvironmentName1
      ProjectIdentifier: !GetAtt DataZoneProject1.Id
    DependsOn: DataZoneEnvironmentProfile

  # 分析用環境の作成
  DataZoneEnvironment2:
    Type: AWS::DataZone::Environment
    Properties:
      DomainIdentifier: !Ref DataZoneDomain
      EnvironmentAccountIdentifier: !Ref AccountId
      EnvironmentAccountRegion: !Ref Region
      EnvironmentProfileIdentifier: !GetAtt DataZoneEnvironmentProfile.Id
      EnvironmentRoleArn: !GetAtt ProvisioningIAMRole.Arn
      Name: !Ref DataZoneEnvironmentName2
      ProjectIdentifier: !GetAtt DataZoneProject2.Id
    DependsOn: DataZoneEnvironmentProfile

Outputs:
  DataZoneDomainId:
    Value: !Ref DataZoneDomain
    Export:
      Name: DataZoneDomainId

  DataZoneProjectId1:
    Value: !GetAtt DataZoneProject1.Id
    Export:
      Name: DataZoneProjectId1

  DataZoneProjectId2:
    Value: !GetAtt DataZoneProject2.Id
    Export:
      Name: DataZoneProjectId2

  DataZoneExecution:
    Value: !GetAtt DomainExecutionIAMRole.Arn
    Export:
      Name: DataZoneExecutionIAMRole

  DataZoneGlueAccess:
    Value: !GetAtt GlueAccessIAMRole.Arn
    Export:
      Name: DataZoneGlueAccess

  DataZoneprovisioning:
    Value: !GetAtt ProvisioningIAMRole.Arn
    Export:
      Name: DataZoneprovisioning
 
 

テンプレートの説明

①Resourcesで主に以下を作成しています。
         ・DataZone作成時に使用する各IAM Role
  ・DataZoneドメイン
  ・DataZone環境内のプロジェクト
  ・プロジェクト内のデータレイク環境(Glue,S3,Athena)
②parametersを用いて可変部分(各Name設定など)はスタック作成時に入力する形にしています。
③今回使用するブループリントはAWSのDefaultDataLakeを使用しています。
④プロジェクト内のデータレイク環境作成時、LakeFormationに管理者権限がないとエラーになってしまうためIAMUserに管理者権限を付与する項目を追加しています。

このテンプレートを使ってDataZone環境を自動構築していきたいと思います。
 

CloudFormationで実行する

 まず初めにS3の作成を行ってください。作成できましたら先ほど保存したテンプレートyamlファイルをアップロードしましょう。アップロードが終わったら、S3オブジェクトURLをコピーしておきましょう。
スクリーンショット 2025-01-16 102542.png

CloudFormationの画面から、スタックを作成していきましょう。画面右上の【スタックの作成】をクリック。「既存のテンプレートを選択」を選択し、コピーしたS3オブジェクトURLをペーストし【次へ】を押してください。
スクリーンショット 2025-01-14 113623.png
 
今回は各リソース名をパラメータで入力するように作成しました。それぞれ任意のパラメータを入力して作成してください。私は以下のように設定しました。
スクリーンショット 2025-01-16 105054.png
スクリーンショット 2025-01-16 105311.png
 
 
【次へ】をクリックし、デフォルトのまま下までスクロールします。「AWS CloudFormationによってIAMリソースがカスタム名で作成される場合があることを承認します。」にチェックを入れて【次へ】をクリックしてください。
スクリーンショット 2025-01-15 170332.png
 
内容に問題がなければスタックを作成してください。すると以下のような画面でリソースの作成が開始されます。しばらく待つとプロジェクト内の環境の作成が開始されます。最終的にステータスが【create_complete】になれば実行成功です。
スクリーンショット 2025-01-15 171309.png
 
今回作成したスタックの他にプロジェクト内の環境分のスタックが2つ構築されているのが確認できます。
スクリーンショット 2025-01-15 171329.png
 
では、DataZoneが無事に作成されているか見てみましょう。DataZoneの画面から、ドメインが作成されていることが確認できました。ドメインをクリックしデータポータルURLからデータポータルに入ります。
スクリーンショット 2025-01-16 103356.png
 
データポータルのホーム画面を見てみるとデフォルトで英語表記になっているので、操作しやすいように日本語に変えておきましょう。右上のアカウントアイコンをクリックし、言語選択から日本語を選択してください。
スクリーンショット 2025-01-16 105429.png
 
左上のプロジェクトを見てみると先ほどパラメータで入力した内容で作成されていることがわかります。
スクリーンショット 2025-01-16 103615.png
 
 
 

Glue Crawlerでテーブルを作成する

それでは次に、Glueでテーブルを作成していきましょう。今回は注文情報のデータが入っているCSVファイルを使っていきます。以下からダウンロードしてください。
まずは先ほど作成したS3にデータをアップロードします。S3に「order」フォルダを作成して、その配下にダウンロードしたorder_data.csvをアップロードしておきます。
スクリーンショット 2025-01-15 103001.png
 スクリーンショット 2025-01-15 103238.png
 
続いてGlue Crawlerでテーブルを作成します。Glueの画面へ行き、左ペイン「Crawler」から【Create Crawler】をクリックしてください。任意の名前を入力して次に進んでください。
スクリーンショット 2025-01-15 110757.png
 
【Browse S3】をクリックして先ほど作成した「order」フォルダを選択してください。その他はデフォルトのまま次に進んでください。
スクリーンショット 2025-01-15 110905.png
 
【Create new IAM role】をクリックし、任意の名前で作成してください。作成したIAM Roleを選択して次に進んでください。
スクリーンショット 2025-01-15 111146.png
 
Target databaseに管理用プロジェクト(salesenvironment_pub_db)を選択してください。内容に問題なければ作成をしてください。
スクリーンショット 2025-01-15 111242.png
 
続いてLakeFormationにCrawler権限を付与します。LakeFormationの画面から左ペインのData Permissionへ行き、【Grant】をクリック。IAM Roleに先ほど作成したロールを選択します。Catalogsには自身のアカウントIDを選択し、Databaseに管理用プロジェクト(salesenvironment_pub_db)を選択してください。権限はcreate tableのみにチェックを入れて【Grant】を押してください。
スクリーンショット 2025-01-16 112402.png
スクリーンショット 2025-01-16 112427.png
 
GlueのCrawlerの画面に戻り、先ほど作成したCrawlerを選択してください。画面右上の【Run crawler】を押してください。しばらく待ってStatusがcompletedになることを確認してください。
スクリーンショット 2025-01-15 111657.png
 
左ペインからTableの画面を見てみると、orderという名前でテーブルが作成されていることが確認できます。
スクリーンショット 2025-01-15 111739.png
 
LakeFormationにデータレイクを登録します。LakeFormationの画面に戻り、左ペインから「Data lake locations」をクリック。画面右上にある【Register location】を押してください。S3 pathには作成した「order」フォルダを選択してください。IAM Roleは「LakeFormationDataAccess」を選択し、LakeFormationにチェックを入れて作成してください。
スクリーンショット 2025-01-15 111848.png
 

動作確認

では実際にプロジェクトにGlueTableを反映し、プロジェクト間でデータを共有できるか確認してみましょう。
 
管理用プロジェクト(salesProject)から画面上部の「データ」タブをクリック。左ペインのデータソースの画面から【データソースを作成】をクリックしてください。任意の名前を入力して、データソースタイプに「AWS Glue」を選択。環境とデータベースをそれぞれ選択して【次へ】を押してください。
スクリーンショット 2025-01-16 125945.png
スクリーンショット 2025-01-16 130020.png
 
「詳細を追加」はデフォルトのまま進み、実行設定は「オンデマンドで実行」を選択してください。確認画面で内容に問題がなければ【作成する】を押してください。
スクリーンショット 2025-01-16 130125.png
 
作成が完了したら、画面右上の【実行】をクリックしてください。
スクリーンショット 2025-01-16 130241.png
 
上部の「データ」タブをクリック。インベントリデータからアセット内にあるorderを選択してください。
スクリーンショット 2025-01-16 130405.png
 
画面右上の【すべて承認】をクリックしてください。
スクリーンショット 2025-01-16 130508.png
 
画面右上の【アクション】から「編集」をクリックしてアセット名を変更しておきましょう。名前は「注文情報」に変えておきます。
スクリーンショット 2025-01-16 130847.png
 
アセット名を変更したら、画面右上の【アセットを公開】からアセットを公開してみましょう。
スクリーンショット 2025-01-16 131055.png
 
続いて分析用プロジェクト(marketingProject)に行き、検索バーで注文情報と入力してください。すると先ほど作成したアセットが出てきますのでアセットをクリックしてください。
スクリーンショット 2025-01-16 165525.png
 
画面右上の【サブスクライブ】をクリックしてください。プロジェクトを選択して、リクエストの理由を入力してください。
スクリーンショット 2025-01-16 131425.png
 
管理用プロジェクト(salesProject)に戻り、「データ」タブから受信リクエストの画面へ行くとリクエストが届いていることが確認できます。アクションの【リクエストを表示】をクリックしてください。
スクリーンショット 2025-01-16 131733.png
 
するとこのような画面になるので承認アクセスで「フルアクセス」を選択して、コメントを入力してから「承認」を押してください。
スクリーンショット 2025-01-16 165353.png
 
リクエストが承認済みになっていることが確認できました。
スクリーンショット 2025-01-16 131935.png
 
 
承認されたので分析用プロジェクト(marketingProject)からデータにアクセスできることを確認しましょう。
プロジェクトを移動し、上部の「環境」タブをクリックしてください。画面下にスクロールしてQuery dataからAthenaを開いてください。
スクリーンショット 2025-01-16 131936.png
 
スクリーンショット 2025-01-16 132410.png
 
Athenaの画面に移動したら、分析用の環境であることを確認してください。データベースに分析用プロジェクトの「xxxx_sub_db」を選択してください。orderテーブルの右側のドットから「テーブルをプレビュー」を押してください。
スクリーンショット 2025-01-16 132518.png
 
すると、order_data_csvのデータが出力され、プロジェクト間でデータの共有ができることを確認できました。スクリーンショット 2025-01-16 132714.png

 

まとめ

最後までお読みいただきありがとうございます。

今回はAWS CloudFormationでAmazon DataZone環境を自動構築してみました。AWS CloudFormationを活用することで簡単にAmazon DataZone環境を構築することができ、新規プロジェクトの導入やプロジェクトに新規メンバーを追加する際にもテンプレートを流用することで作業負荷を軽減することが可能になります。Amazon DataZoneの導入を検討されている方はぜひご参考にしていただければと思います。

最後に「このサービスについて知りたい」「AWS環境の構築、移行」などのリクエストがございましたら、弊社お問合せフォームまでお気軽にご連絡ください! のちほど当ブログにてご紹介させていただくか、複雑な内容に関するお問い合わせの内容の場合には直接営業からご連絡を差し上げます。

※Amazon Web Services、”Powered by Amazon Web Services”ロゴ、およびブログで使用されるその他のAWS商標は、米国その他の諸国における、Amazon.com, Inc.またはその関連会社の商標です。

  • このエントリーをはてなブックマークに追加

お問い合わせ

Contact

ご質問やご相談、サービスに関する詳細など、何でもお気軽にご連絡ください。下記のお問い合わせフォームよりお気軽に送信ください。

お問い合わせ

資料ダウンロード

Download

当社のサービスに関する詳細情報を掲載した資料を、下記のページよりダウンロードいただけます。より深く理解していただける内容となっております。ぜひご活用ください。

資料ダウンロード