CDK LakeFormation permissions

0

Hi, I am trying to create Glue database and grant permissions on it in Lake Formation. I tried several ways and several IAM roles and policies based on the documentation but every time I get Insufficient Lake Formation permission(s): Required Create Database on Catalog. The code is pretty much straightforward and when I define permissions in Lake Formations I specify ALL value. Does anyone have an idea what is missing in the code?

class ExampleStack(Stack):

    def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)

        custom_data_bucket_arn = "arn:aws:s3:::transformed-v5"
        s3_location = "s3://transformed-v5"
        bucket_name = "transformed-v5"

        glue_role = cdk.aws_iam.Role(self, "glue_role", 
            assumed_by=cdk.aws_iam.ServicePrincipal('glue.amazonaws.com'),
            managed_policies= [
                cdk.aws_iam.ManagedPolicy.from_managed_policy_arn(self, 'MyCrawlerGlueRole', 
                    managed_policy_arn='arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole'
                    )
                ]
        )
        
        glue_role.add_to_policy(cdk.aws_iam.PolicyStatement(actions=['s3:*', 'lakeformation:GetDataAccess', "lakeformation:GrantPermissions"], effect=cdk.aws_iam.Effect.ALLOW, resources=['*']))
        glue_role.add_to_policy(cdk.aws_iam.PolicyStatement(actions=["iam:PassRole"], effect=cdk.aws_iam.Effect.ALLOW, resources=['arn:aws:iam::xxxxxxx:role/{}'.format(glue_role.role_name)]))

        glue_db=cdk.aws_glue.CfnDatabase(self, "MyDatabase", 
            catalog_id=cdk.Aws.ACCOUNT_ID,
            database_input=cdk.aws_glue.CfnDatabase.DatabaseInputProperty(
               
                name = "datalake-v5",
                location_uri = s3_location
               
            )
        )
        cdk.aws_glue.CfnCrawler(self, "datalake-crawler", 
            database_name= "datalake-v5",
            role=glue_role.role_arn,
            schedule={"scheduleExpression":"cron(0/15 * * * ? *)"},
            targets={"s3Targets": [{"path":  bucket_name}]}, 
        ) 

        location_resource = cdk.aws_lakeformation.CfnResource(self, 
                "MyDatalakeLocationResource", 
                resource_arn= custom_data_bucket_arn, 
                use_service_linked_role=True
        )
        cdk.aws_lakeformation.CfnPermissions(self, "MyDatalakeDatabasePermission",
                data_lake_principal=cdk.aws_lakeformation.CfnPermissions.DataLakePrincipalProperty(data_lake_principal_identifier=glue_role.role_arn),
                resource=cdk.aws_lakeformation.CfnPermissions.ResourceProperty(database_resource=cdk.aws_lakeformation.CfnPermissions.DatabaseResourceProperty(name="datalake-v5")),
                permissions=["ALL"],
                permissions_with_grant_option=["ALL"]
            )
        location_permission = cdk.aws_lakeformation.CfnPermissions(self, "MyDatalakeLocationPermission",
                data_lake_principal=cdk.aws_lakeformation.CfnPermissions.DataLakePrincipalProperty(data_lake_principal_identifier=glue_role.role_arn),
                resource=cdk.aws_lakeformation.CfnPermissions.ResourceProperty(data_location_resource=cdk.aws_lakeformation.CfnPermissions.DataLocationResourceProperty(s3_resource=custom_data_bucket_arn)),
                permissions=["DATA_LOCATION_ACCESS"]
            )
   
        location_permission.add_dependency(location_resource)

Thank you!

Moma
已提问 1 年前1348 查看次数
1 回答
0

The issue seems to be that CDK on deployment fails (please correct me if I'm wrong).
Only Lakeformation administrators or "database creators" can do that, the permission ALL applies once it is created.
Instead of granting the CDK deployment role such privilege, if you only need one it might be easier to create it manually by an administrator.

https://docs.aws.amazon.com/lake-formation/latest/dg/creating-database.html

profile pictureAWS
专家
已回答 1 年前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则