データソース別の設定
データソースの設定

Amazon Athenaデータソースの設定

Amazon Athenaのデータソースは以下の手順で設定します。

事前準備

ベースマキナでAmazon Athenaを利用するには、事前にAWSでデータベースの作成と認証情報の準備が必要です。認証情報は、アクセスキーによる認証とOIDCによる認証のどちらか一方を選んで用意します。

Amazon Athenaのデータベースの作成

AWSのコンソール上で、ベースマキナから接続するAmazon Athenaのデータベースを作成します。

Amazon Athenaのデータベースの作成方法は、AWSのドキュメントのステップ 1: データベースを作成する (opens in a new tab)をご参照ください。

アクセスキーで接続する

ベースマキナからAmazon Athenaへ接続するために、IAMユーザーを作成しアクセスキーを発行します。

IAMユーザーの作成とアクセスキーの発行は、AWSのドキュメントのIAM ユーザーのアクセスキーの管理 (opens in a new tab)をご参照ください。

IAMユーザーには、少なくとも下記の権限を持ったIAMポリシーを割り当てる必要があります。

  • athena:StartQueryExecution
  • athena:GetQueryExecution
  • athena:GetQueryResults
  • athena:GetPreparedStatement
  • athena:CreatePreparedStatement
  • athena:DeletePreparedStatement
  • glue:GetDatabase
  • glue:GetTable
  • s3:GetObject
  • s3:ListBucket
  • s3:PutObject

その他、ベースマキナからAmazon Athenaに対して実行したい操作に応じて、必要な権限を追加してください。

Amazon AthenaでのIAMポリシーの詳細は、AWSのドキュメントのAthena でのアイデンティティとアクセス権の管理 (opens in a new tab)をご参照ください。

OIDC で接続する

OpenID Connect (OIDC) を使用すると、アクセスキーをベースマキナに渡すことなく、IAMロールの権限でAmazon Athenaを操作できます。ベースマキナが発行するID Tokenを使って sts:AssumeRoleWithWebIdentity を実行し、一時的な認証情報を取得します。

なお、OIDCを利用する場合は、前述のIAMユーザーの作成およびアクセスキーの登録は不要です(認証方式はいずれか一方を選択します)。

以下のTerraformコードで必要なリソースを作成します。<ROLE_NAME> は作成するIAMロールの名前です。<AUDIENCE> は任意の文字列で、ベースマキナ側の接続設定の「Audience」と同じ値にする必要があります。<TENANT_SUBDOMAIN>、<PROJECT_ID>、<ENVIRONMENT_ID> は信頼ポリシーの条件に使うベースマキナ側の識別子で、確認方法は後述の「IDトークンのsubクレーム」をご参照ください。<REGION>、<ACCOUNT_ID>、<DATABASE_NAME> は、接続するAWSアカウントのリージョン、アカウントID、Amazon Athenaのデータベース名です。<DATA_BUCKET_NAME> はデータ本体を保存しているバケットの名前、<QUERY_RESULT_BUCKET_NAME> はクエリの結果の出力先バケットの名前です。いずれも環境に合わせて置き換えてください。

provider "aws" {
  region = "<REGION>"
}
 
# ベースマキナの IdP を信頼する OIDC プロバイダー
data "tls_certificate" "basemachina" {
  url = "https://idp.basemachina.com"
}
 
resource "aws_iam_openid_connect_provider" "basemachina" {
  url            = "https://idp.basemachina.com"
  client_id_list = ["<AUDIENCE>"]
  thumbprint_list = [
    data.tls_certificate.basemachina.certificates[length(data.tls_certificate.basemachina.certificates) - 1].sha1_fingerprint,
  ]
}
 
# ベースマキナが権限借用する IAM ロール
resource "aws_iam_role" "basemachina" {
  name = "<ROLE_NAME>"
 
  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [{
      Effect    = "Allow"
      Principal = { Federated = aws_iam_openid_connect_provider.basemachina.arn }
      Action    = "sts:AssumeRoleWithWebIdentity"
      Condition = {
        StringEquals = {
          "idp.basemachina.com:aud" = "<AUDIENCE>"
          "idp.basemachina.com:sub" = "tenant:<TENANT_SUBDOMAIN>:project:<PROJECT_ID>:environment:<ENVIRONMENT_ID>"
        }
      }
    }]
  })
}
 
# Athenaでのクエリ実行権限
resource "aws_iam_role_policy" "athena" {
  role = aws_iam_role.basemachina.id
 
  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Effect = "Allow"
        Action = [
          "athena:StartQueryExecution",
          "athena:StopQueryExecution",
          "athena:GetQueryExecution",
          "athena:GetQueryResults",
          "athena:GetWorkGroup",
          "athena:CreatePreparedStatement",
          "athena:GetPreparedStatement",
          "athena:UpdatePreparedStatement",
          "athena:DeletePreparedStatement",
        ]
        Resource = [
          "arn:aws:athena:<REGION>:<ACCOUNT_ID>:workgroup/primary",
          "arn:aws:athena:<REGION>:<ACCOUNT_ID>:datacatalog/AwsDataCatalog",
        ]
      },
    ]
  })
}
⚠️

athena:CreatePreparedStatement と athena:StartQueryExecution は、workgroupとdatacatalogの両方のリソースに対する許可を要求します。datacatalogを別のステートメントに分けたり省いたりすると、AccessDeniedException になります。ベースマキナはクエリをprepared statement経由で実行するため、prepared statementに関する権限も必須です。

また、ベースマキナが使用するワークグループは primary です。

続けて、GlueデータカタログとAmazon S3へのアクセス権限を与えます。

# Glueデータカタログの参照権限
resource "aws_iam_role_policy" "glue" {
  role = aws_iam_role.basemachina.id
 
  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Effect = "Allow"
        Action = [
          "glue:GetDatabase",
          "glue:GetDatabases",
          "glue:GetTable",
          "glue:GetTables",
          "glue:GetPartition",
          "glue:GetPartitions",
        ]
        Resource = [
          "arn:aws:glue:<REGION>:<ACCOUNT_ID>:catalog",
          "arn:aws:glue:<REGION>:<ACCOUNT_ID>:database/<DATABASE_NAME>",
          "arn:aws:glue:<REGION>:<ACCOUNT_ID>:table/<DATABASE_NAME>/*",
        ]
      },
    ]
  })
}
 
# データ本体とクエリ結果の出力先バケットへのアクセス権限
resource "aws_iam_role_policy" "s3" {
  role = aws_iam_role.basemachina.id
 
  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Effect   = "Allow"
        Action   = "s3:GetObject"
        Resource = "arn:aws:s3:::<DATA_BUCKET_NAME>/*"
      },
      {
        Effect   = "Allow"
        Action   = ["s3:ListBucket", "s3:GetBucketLocation"]
        Resource = "arn:aws:s3:::<DATA_BUCKET_NAME>"
      },
      {
        Effect   = "Allow"
        Action   = ["s3:GetObject", "s3:PutObject"]
        Resource = "arn:aws:s3:::<QUERY_RESULT_BUCKET_NAME>/*"
      },
      {
        Effect   = "Allow"
        Action   = ["s3:ListBucket", "s3:GetBucketLocation"]
        Resource = "arn:aws:s3:::<QUERY_RESULT_BUCKET_NAME>"
      },
    ]
  })
}

IDトークンのsubクレーム

ベースマキナが発行するID Tokenの sub クレームには、次の形式でテナント・プロジェクト・環境の識別子が含まれます。

tenant:<TENANT_SUBDOMAIN>:project:<PROJECT_ID>:environment:<ENVIRONMENT_ID>

各識別子は以下の方法で確認できます。

識別子確認方法
<TENANT_SUBDOMAIN>ご利用のサブドメイン(xxx.basemachina.com の xxx 部分)
<PROJECT_ID>データソースの設定画面のURL(/projects/<PROJECT_ID>/environments/<ENVIRONMENT_ID>/...)
<ENVIRONMENT_ID>同上

テナント・プロジェクト・環境の識別子には個別の条件キーがないため、sub に含めています。

信頼ポリシーの条件で sub を検証すると、ロールを引き受けられるベースマキナの環境を制限できます。第三者が自身のベースマキナ環境から同じIAMロールを引き受けることを防ぐため、sub の条件を設定することを推奨します。

複数の環境をまとめて許可する場合は、StringLike による前方一致を利用できます。

Condition = {
  StringEquals = {
    "idp.basemachina.com:aud" = "<AUDIENCE>"
  }
  StringLike = {
    "idp.basemachina.com:sub" = "tenant:<TENANT_SUBDOMAIN>:*"
  }
}

ベースマキナ側の設定

セットアップ完了後、データソースの接続設定で認証方式として「OIDC」を選択し、以下の情報を入力します。

項目値例
AudienceOIDCプロバイダーに登録した値と同じ文字列basemachina-athena
IAM ロール ARN作成したIAMロールのARNarn:aws:iam::123456789012:role/role-name
認証方式にOIDCを選んだAmazon Athenaのデータソースの作成画面

データソースの作成

認証方式にアクセスキーを選んだAmazon Athenaのデータソースの作成画面
  1. 右上のメニューから「データソース」を選択してデータソース一覧画面に移動します。
  2. 「データソースの追加」を選択してデータソースの追加画面に移動します。
  3. 「Amazon Athena」を選択して、Amazon Athenaのデータソースの作成画面に移動します。
  4. 各設定項目を入力します。
  5. 「保存」を選択します。

Amazon Athenaのデータソースには以下の項目を設定します。

名前

データソースの名前を設定します。

リージョン

接続するAmazon Athenaのデータベースのリージョンを設定します。

データベース名

接続するAmazon Athenaのデータベースの名前です。

クエリの結果の場所

接続するAmazon Athenaのデータベースのクエリ結果の場所です。

例)s3://bucket-name/prefix/object-name

認証方式

接続に使用する認証方式を「アクセスキー」または「OIDC」から選択します。

アクセスキー

認証方式で「アクセスキー」を選択した場合に設定します。発行したIAMユーザーのアクセスキーです。

シークレットアクセスキー

認証方式で「アクセスキー」を選択した場合に設定します。発行したIAMユーザーのシークレットアクセスキーです。

IAM ロール ARN

認証方式で「OIDC」を選択した場合に設定します。作成したIAMロールのARNです。

Audience

認証方式で「OIDC」を選択した場合に設定します。OIDCプロバイダーに登録した値と同じ文字列です。

データソースの編集

  1. 右上のメニューから「データソース」を選択してデータソース一覧画面に移動します。
  2. 編集するデータソースを選択してデータソースの編集画面に移動します。
  3. 各設定項目を入力します。
  4. 「保存」を選択します。

データソースの削除

データソースの削除
  1. 右上のメニューから「設定」を選択してプロジェクト設定画面に移動します。
  2. 「データソース設定」を選択してデータソース設定画面に移動します。
  3. 削除するデータソースの行の右端の3点リーダから「削除する」を選択します。
  4. 表示される画面で「OK」を選択します。