Skip to main content

Prerequisites

  • By default, Athena authentication uses role-based access. You will need the trust policy prepopulated with our identifier to grant access. It should look similar to the following JSON object with a proper service account identifier:
Trust policy
1

Create a destination bucket, service policy, and role

Create Athena target bucket

Follow these steps to create a bucket to be used for staging data before transferring to a destination.
  1. Navigate to the S3 service page.
  2. Click Create bucket.
  3. Enter a Bucket name, select an AWS Region, and modify any of the default settings as desired. Note: Object Ownership can be set to “ACLs disabled” and Block Public Access settings for this bucket can be set to “Block all public access” as recommended by AWS. Make note of the Bucket name and AWS Region.
  4. Click Create bucket.

Create Athena access policy

  1. Navigate to the IAM service page, click on the Policies navigation tab, and click Create policy.
  2. Click the JSON tab, and paste the following policy, being sure to replace ACCOUNT_ID, WORKGROUP, BUCKET_NAME and SCHEMA with the your account information.
    • WORKGROUP should be primary unless you enter a different workgroup in the workgroup field when adding your destination.
    • BUCKET should refer to the bucket created in the previous step.
    • SCHEMA used below does not need to be created ahead of time. If it does not exist, it will be created automatically before transferring data.
Access policy
KMS encryption (optional)If your S3 bucket uses KMS encryption (CMK), add the following statement to the Statement array of your IAM policy to allow data encryption/decryption with your KMS key. Encryption with SSE-C is not currently supported.
KMS policy statement
Replace REGION_NAME, ACCOUNT_ID, and KEY_ID with your values.
Athena vs. S3 permissionsBecause Athena uses S3 as the underlying storage layer, the Resource access requested in the policy is scoped down via resource-specific permissions in the S3 actions.
  1. Click through to the Review step, choose a name for the policy, for example, transfer-service-policy (this will be referenced in the next step), add a description, and click Create policy.

Create role

2

Add your destination

  1. Use the following details to complete the connection setup: database, schema, workgroup, bucket name, bucket region, and IAM Role ARN.
3

Data Management

Follow these guidelines to manage your new Athena tables effectively:

Optimize Iceberg queries

Iceberg tables are compacted automatically. Once per day, after a transfer writes new data to a table, an OPTIMIZE ... REWRITE DATA command is run on that table to reorganize its data files and improve query efficiency.

Set vacuum properties

Iceberg tables can accumulate snapshots over time, which can affect performance. To manage this, set the maximum age for snapshots that the vacuum process should retain:
Set vacuum properties
The default setting is 432000 seconds, we recommend only updating this if you notice degrading performance.

Perform time travel queries

Iceberg supports accessing historical data snapshots using time travel queries. This feature allows you to query the table as it appeared at a previous point in time, which is useful for audits and rollbacks:
Time travel query
Replace timestamp with the specific UNIX timestamp of the snapshot you wish to query.

Terraform

If your organization manages infrastructure with Terraform, you can use the configuration below instead of creating the bucket, policy, and role above. It sets up the same resources and permissions, using IAM role authentication.
  • Use the official hashicorp/aws provider, version 6.0 or later.
  • In terraform.tfvars, set bucket_name, schema, and trust_policy_json (the trust policy provided to you). The optional inputs and their defaults are create_database (false), workgroup (primary), role_name (transfer-role), policy_name (transfer-service-policy), kms_key_arn (empty), and force_destroy (false).
  • After terraform apply, use the schema, workgroup, bucket_name, bucket_region, and role_arn outputs, with a query results folder name such as default as the database, to complete the connection setup. Print each with terraform output -raw <name>.

Permissions checklist

  • IAM role trust policy allows the service to assume the role.
  • IAM policy includes all Athena actions on the target workgroup ARN.
  • IAM policy includes all Glue actions on the target catalog, database, and tables.
  • IAM policy includes s3:PutObject, s3:ListBucket, s3:GetBucketLocation, s3:GetObject, s3:DeleteObject on the staging bucket and its contents.
  • If using KMS encryption: kms:GenerateDataKey and kms:Decrypt granted on the key.

FAQ

We use IAM role-based authentication. We assume the IAM role you configure using short-lived credentials. No static access keys are required. All access is scoped to the permissions defined in the role’s IAM policy.
Athena uses the AWS Glue Data Catalog to store and manage table metadata. The Glue permissions allow the service to create and update table definitions as data is synced.
No. If the Glue database does not exist, it is created automatically before the first transfer. The glue:CreateDatabase permission in the policy enables this. If you prefer to use an existing database, remove glue:CreateDatabase from the policy and provide the existing database name.