Based on the DEA-C01 exam guideReport an error
IAMAllowedPrincipals permission remains, Lake Formation permissions are not enforced.As a data lake grows, it becomes hard to manage "who can access which tables, columns, and rows" with IAM policies alone. If you use only S3 + the Glue Data Catalog, permissions are split into two places.
glue:GetTable in IAM policies, and Glue resource policies.s3:GetObject in IAM policies.In this structure, the smallest unit of permission is the S3 prefix. You cannot express "everything in this table except the national ID number column" or "only the rows for the user's own region." To hide a column, you have to build a separate copy of the table without that column.
Lake Formation turns this into an RDBMS-style permission model. Permissions are applied in two layers.
GetTables response at all.💡 Related Theory: Lake Formation uses the Glue Data Catalog as its permission control point. It does not create a separate catalog; it layers GRANT/REVOKE on the databases and tables of the same catalog. So crawlers, ETL jobs, and Athena tables stay as they are, and only the permission layer changes.
When an analyst queries a Lake Formation-managed table with Athena, it proceeds in the following order.
① Metadata request Athena → Data Catalog : give me this table's definition
② Permission check Data Catalog → Lake Formation : can this user see it?
→ returns metadata containing only the permitted columns to the engine
③ Credential request Athena → Lake Formation : give me access to the data in the registered location
→ Lake Formation issues temporary credentials with the role specified at registration
④ Data read Athena → S3 : reads with the temporary credentials, applies column/row/cell filters, returns results# Register an S3 location with Lake Formation (specify the role Lake Formation will use)
aws lakeformation register-resource \
--resource-arn arn:aws:s3:::acme-datalake-clean-prod \
--role-arn arn:aws:iam::111122223333:role/LakeFormationServiceRoleThe registration target is a bucket or a prefix under a bucket (individual objects are not allowed). There are two kinds of registration roles.
| Role | Characteristics | When you must use a user-defined role |
|---|---|---|
| Service-linked role | Simplest. Required permissions are granted automatically | - |
| User-defined role | You configure the S3 read/write inline policy and the lakeformation.amazonaws.com trust relationship yourself | Registering a location in another account, a location encrypted with an AWS managed key (aws/s3), a location accessed through Amazon EMR |
iam:PassRole for that role.| Target | Main permissions |
|---|---|
| Database | CREATE_TABLE, ALTER, DROP, DESCRIBE |
| Table | SELECT, INSERT, DELETE, ALTER, DROP, DESCRIBE |
| Data location | DATA_LOCATION_ACCESS |
| LF-Tag | DESCRIBE, ASSOCIATE |
lakeformation:GetDataAccess IAM permission (without it, the user cannot request temporary credentials), and on top of that must receive Lake Formation's SELECT and so on. For Athena, this IAM permission is needed by the user; for other engines, by the execution role.SELECT and INSERT are enough for reading and writing. It is the mechanism that prevents someone from creating a table at an arbitrary location to pull data out.WITH GRANT OPTION can be granted again to other principals. It is used when delegating permission management to domain teams.DESCRIBE on all resources, data location permission on all locations, and GRANT/REVOKE permission. The person who created a table implicitly has all permissions on that table.So as not to break existing Glue users, Lake Formation by default attaches a permission (Super) for a virtual group called IAMAllowedPrincipals to every database and table. This group means "all principals that can access catalog resources through IAM policies."
IAMAllowedPrincipals permission on the resource, and change the account settings so that this permission is not automatically attached to new databases and tables.⚠️ Pitfall: The cause of "I set a column restriction in Lake Formation but the analyst still sees all columns" is usually one of two things. Either the
IAMAllowedPrincipalspermission remains, or the analyst's IAM policy has direct S3 permissions, leaving open a path that bypasses Lake Formation. Lake Formation's permission model cannot block direct reads through the S3 API. Control is complete only when you remove the direct S3 permissions.
If you cannot switch everything at once, register the location in hybrid access mode. It keeps two paths open at the same time on the same catalog object.
The purpose of this mode is "apply column restrictions only to a new analyst group without touching existing ETL jobs."
# Named: allow SELECT on only some columns of a specific table for AnalystRole
aws lakeformation grant-permissions \
--principal DataLakePrincipalIdentifier=arn:aws:iam::111122223333:role/AnalystRole \
--permissions "SELECT" \
--resource '{"TableWithColumns": {"DatabaseName": "sales_db", "Name": "orders",
"ColumnNames": ["order_id", "region", "amount"]}}'# LF-Tag based: allow all tables tagged classification=pii only for SecurityRole
aws lakeformation grant-permissions \
--principal DataLakePrincipalIdentifier=arn:aws:iam::111122223333:role/SecurityRole \
--permissions "SELECT" \
--resource '{"LFTagPolicy": {"ResourceType": "TABLE",
"Expression": [{"TagKey": "classification", "TagValues": ["pii"]}]}}'| Aspect | Named resources | LF-Tags (LF-TBAC) |
|---|---|---|
| Grant unit | Databases, tables, and columns specified by name | All resources matching a tag expression |
| Number of operations needed | Number of principals × number of resources | Number of principals + number of resources |
| When a new table is created | GRANT again | Applied automatically once you attach the tag (or inherit it) |
| Suitable scale | A few tables, exceptional permissions | Environments with many tables that grow quickly |
| Inheritance | None | Inherited from database → table → column, can be overridden at lower levels |
department=sales, and one key can have multiple values defined.Fine-grained security is built with an object called a data filter. A filter belongs to a specific table and holds a column specification and a row filter expression.
| Level | Filter composition | Example |
|---|---|---|
| Column | Specify included/excluded columns + all rows | Only the rest, excluding PII columns |
| Row | All columns + a row filter expression | Only rows where region = 'us-east-1' |
| Cell | Specify columns + a row filter expression | Expose the address column only in US rows |
# Cell-level filter: only US East rows, excluding the customer_name column
aws lakeformation create-data-cells-filter --table-data '{
"TableCatalogId": "111122223333",
"DatabaseName": "sales_db",
"TableName": "orders",
"Name": "us-east-no-name",
"RowFilter": {"FilterExpression": "region = '\''us-east-1'\''"},
"ColumnWildcard": {"ExcludedColumnNames": ["customer_name"]}
}'SELECT.SELECT, you must specify that filter (DataCellsFilter) as the resource for it to take effect.ColumnNames) or the excluded columns (ColumnWildcard.ExcludedColumnNames).A blueprint is a template for a common ingestion pattern, and running it generates a workflow made up of Glue crawlers, jobs, and triggers.
| Blueprint | Behavior | Selection criteria |
|---|---|---|
| Database snapshot | Loads and reloads all tables of a JDBC source in full (exclusion patterns can be specified) | The schema changes freely (column renames, deletions) and must match the source exactly |
| Incremental database | Loads only new data based on a bookmark column. You specify target tables one by one | Columns are only added, only new rows arrive and existing rows are not modified |
| Log file | Bulk-loads CloudTrail, ELB, and ALB logs | AWS service logs |
SELECT on the created tables.A blueprint is a generator of Glue workflows. The output is ordinary Glue crawlers, jobs, and triggers, so you monitor them directly in the Glue console, and the cost is incurred on the Glue side for as long as those crawlers and jobs run. However, users cannot edit the blueprints and workflows created by Lake Formation.
Lake Formation shares catalog resources directly with other accounts, organizations, OUs, or IAM principals in other accounts. Internally it uses AWS RAM.
| Symptom | Cause | Action |
|---|---|---|
| Column restriction set but everything is visible | IAMAllowedPrincipals permission remains | Revoke it on the resource, change the default settings |
| Reads S3 directly, bypassing Lake Formation | The user's IAM has direct S3 permissions | Remove the direct S3 permissions |
Access Denied even though SELECT was granted | No lakeformation:GetDataAccess, location not registered, insufficient S3/KMS permissions on the registration role | Add the IAM permission, register the location, fix the role policy |
| Table creation fails | No data location permission | Grant DATA_LOCATION_ACCESS |
| A shared table does not appear in Athena | RAM invitation not accepted, no resource link | Accept the invitation, create a resource link |
| EMR cannot read a registered location | Registered with the service-linked role | Deregister and re-register with a user-defined role |
| Clue in the question | Answer |
|---|---|
| "Let users query a table without direct S3 permissions" | Location registration + credential vending |
| "Thousands of tables, make permission management scalable" | LF-Tags (LF-TBAC) |
| "Hide PII columns" | Column-level permissions (included/excluded columns) |
| "Only rows for the user's own region or department" | Row filter of a data filter |
| "The visible columns differ depending on the row" | Cell-level security (columns + row filter) |
| "Keep existing IAM-based access while switching only some users" | Hybrid access mode |
| "Share a table with another account without copying" | Lake Formation cross-account sharing (RAM) + resource link |
| "Automatically generate a workflow that loads a JDBC source incrementally" | Incremental database blueprint |
| "Audit who accessed which data" | CloudTrail |
Tomorrow we cover open table formats, which add a transaction layer on top of Parquet in S3 to enable row-level updates and deletes and time travel.
Click a choice to reveal the answer and explanation.
Question 1
Which mechanism allows an analyst to read data in a location registered through Lake Formation even without direct IAM permissions on the S3 bucket?
Question 2
When the number of data lake tables grows to thousands, which Lake Formation approach improves scalability by attaching tags such as classification=pii to resources and granting permissions based on tag conditions?
Question 3
What do you use in Lake Formation to expose only the rows where region = 'us-east-1' to a specific user?
Question 4
Which Lake Formation blueprint do you use to automatically create a Glue workflow that incrementally loads a JDBC source such as RDS based on a bookmark column?
Question 5
What combination of permissions is required for an analyst to query a Lake Formation-managed table with Athena?