AWS Identity and Access Management (IAM) を使用して Amazon Athena のクエリとリソースへのアクセスを制限したいです。
簡単な説明
IAM ポリシーとエンティティ (ユーザーまたはロール) を使用すると、クエリや AWS サービスなどの Athena リソースへのアクセスを制限または許可できます。
注: IAM のセキュリティベストプラクティスに必ず従ってください。
解決策
以下のガイドラインに従って、ユースケースに適した Athena アクセス許可を確認または付与してください。
Amazon S3 バケットの場所にアクセスする
Athena クエリは、Amazon Simple Storage Service (Amazon S3) のソースデータバケットとクエリ結果バケットの場所にアクセスできる必要があります。
S3 バケットの場所へのアクセス許可を付与する IAM ポリシーの例を次に示します。
{
"Sid": "BaseQueryResultsPermissions",
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:GetObject",
"s3:ListBucket",
"s3:ListBucketMultipartUploads",
"s3:ListMultipartUploadParts",
"s3:AbortMultipartUpload",
"s3:CreateBucket",
"s3:PutObject",
"s3:PutBucketPublicAccessBlock"
],
"Resource": [
"arn:aws:s3:::Query-Result-Bucket-Name",
"arn:aws:s3:::Query-Result-Bucket-Name/"
]
}
注: Query-Result-Bucket-Name は、実際のバケット名に置き換えてください。
クエリが S3 ソースおよびクエリ結果バケットにアクセスできない場合、Access Denied エラーが発生することがあります。詳細については、「Amazon Athena でクエリを実行すると、アクセス拒否エラーが発生する理由を教えてください」を参照してください。
Amazon S3 バケットへのアクセス許可
Athena クエリには Amazon S3 バケットへのアクセス許可も必要です。
S3 バケットにアクセス許可を付与する IAM ポリシーの例を次に示します。
{
"Sid": "BaseAthenaExamplesPermissions",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::Glue-Database-Warehouse-Location",
"arn:aws:s3:::Glue-Database-Warehouse-Location/",
"arn:aws:s3:::Glue-Table-Location",
"arn:aws:s3:::Glue-Table-Location/"
]
},
{
"Sid": "BaseS3BucketPermissions",
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation",
"s3:ListAllMyBuckets"
],
"Resource": [
""
]
}
注: Glue-Database-Warehouse-Location および Glue-Table-Location は、実際の変数に置き換えてください。
AWS Key Management Service (AWS KMS) キーを使用して暗号化を行う場合は、「サポートされている Amazon S3 暗号化オプション」を参照してください。
Athena ワークグループへのアクセス
ワークグループを使用して、クエリのアクセスとコストを制御できます。Athena クエリのワークグループへのアクセスを許可するために使用できる IAM ポリシーの例をご覧ください。
Glue Data Catalog データベースとテーブルへのアクセス
AWS Glue データカタログ内のデータベースとテーブルに、詳細なアクセス制御を使用できます。
Data Catalog テーブルへのアクセスを許可するポリシーの例を次に示します。
{
"Effect": "Allow",
"Action": [
"glue:GetDatabase",
"glue:GetDatabases",
"glue:GetTable",
"glue:DeleteTable",
"glue:GetPartitions",
"glue:GetPartition",
"glue:DeletePartition",
"glue:BatchCreatePartition"
],
"Resource": [
"arn:aws:glue:us-east-1:123456789012:catalog",
"arn:aws:glue:us-east-1:123456789012:database/example_db",
"arn:aws:glue:us-east-1:123456789012:table/example_db/test"
]
},
{
"Effect": "Deny",
"Action": "glue:*",
"NotResource": [
"arn:aws:glue:us-east-1:123456789012:database/example_db",
"arn:aws:glue:us-east-1:123456789012:table/example_db/test"
]
}
注: example_db および example_db/test は、実際の変数に置き換えてください。
データカタログが暗号化されている場合は、次のアクションを追加する必要があります。
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": [
"kms:GenerateDataKey",
"kms:Decrypt",
"kms:Encrypt"
],
"Resource": "arn of the key used to encrypt the catalog"
}
}
詳細については、「テーブルとデータベースへの詳細なアクセス許可の例」を参照してください。
関連情報
Athena における ID およびアクセス管理
Athena の Amazon S3 バケットへのクロスアカウントアクセス