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:StartQueryExecutionathena:GetQueryExecutionathena:GetQueryResultsathena:GetPreparedStatementathena:CreatePreparedStatementathena:DeletePreparedStatementglue:GetDatabaseglue:GetTables3:GetObjects3:ListBuckets3: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」を選択し、以下の情報を入力します。
| 項目 | 値 | 例 |
|---|---|---|
| Audience | OIDCプロバイダーに登録した値と同じ文字列 | basemachina-athena |
| IAM ロール ARN | 作成したIAMロールのARN | arn:aws:iam::123456789012:role/role-name |

データソースの作成

- 右上のメニューから「データソース」を選択してデータソース一覧画面に移動します。
- 「データソースの追加」を選択してデータソースの追加画面に移動します。
- 「Amazon Athena」を選択して、Amazon Athenaのデータソースの作成画面に移動します。
- 各設定項目を入力します。
- 「保存」を選択します。
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プロバイダーに登録した値と同じ文字列です。
データソースの編集
- 右上のメニューから「データソース」を選択してデータソース一覧画面に移動します。
- 編集するデータソースを選択してデータソースの編集画面に移動します。
- 各設定項目を入力します。
- 「保存」を選択します。
データソースの削除

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