尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

使用 Terraform AWS Provider 的 aws_lakeformation_resource 数据源查询已注册的 Lake Formation 数据位置

使用 Terraform AWS Provider 的 aws_lakeformation_resource 数据源查询已注册的 Lake Formation 数据位置 使用 Terraform AWS Provider 的 aws_lakeformation_resource 数据源查询已注册的 Lake Formation 数据位置【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws导读aws_lakeformation_resource是 terraform-provider-aws 在 Lake Formation 服务下提供的一个数据源Data Source用于查询 AWS Lake Formation 中已注册数据位置Registered Data Location通常是一个 S3 路径的详细信息包括注册所用 IAM 角色、混合访问模式、联邦federation与特权访问标记等。本文以仓库中的 数据源官方文档 为主线结合 resource_data_source.go、resource.go 及对应测试代码完整讲解该数据源的参数、导出属性、底层实现与实战用法。数据源概述它查询的是什么AWS Lake Formation 要求在使用某个数据位置典型为 S3 存储桶或前缀之前先将其注册到 Lake Formation 中。注册时通常会绑定一个 IAM 角色用于 Lake Formation 代表调用方访问底层数据并可以附带若干行为标记。aws_lakeformation_resource数据源正是用来读取这类已注册资源的状态信息。它不做任何写操作只通过只读 API 获取快照供 Terraform 配置中其他资源或输出output引用。从源码看它被注册为 Lake Formation 服务包中的 SDK 数据源之一见 service_package_gen.go。典型应用场景在已由其他流程控制台、CLI 或本 Provider 的aws_lakeformation_resource资源注册过数据位置的账户中以声明式方式获取该位置的元数据将查询到的role_arn、last_modified等信息输出给下游模块如权限策略、监控告警配置在配置中判断某个数据位置当前是否开启了混合访问、联邦或特权访问模式。使用前提数据位置必须先注册该数据源本身是只读的它要求目标 ARN 对应的数据位置已经在 Lake Formation 中完成注册。若未注册DescribeResourceAPI 会返回EntityNotFoundExceptionProvider 会将资源 ID 置空并从状态中移除见 resource_data_source.go。在本仓库中注册动作由同名的管理资源aws_lakeformation_resource完成其源码位于 resource.go通过RegisterResourceAPI 实现注册、DeregisterResource实现注销。因此最常见的组合是先用aws_lakeformation_resource资源注册数据位置再用本数据源读取其详情。参数详解Argument Reference该数据源支持以下参数参数必填类型说明arn是string要查询的 Lake Formation 资源的 ARN即一个 S3 路径的 ARN例如arn:aws:s3:::my-bucket或带前缀的arn:aws:s3:::my-bucket/data/。在 resource_data_source.go 中该参数被声明为Required并通过verify.ValidARN做 ARN 格式校验。region否string该资源被管理的区域。默认使用 Provider 配置 中设置的区域。从 service_package_gen.go 可以看到Provider 会根据配置覆盖客户端默认区域确保 Lake Formation API 调用落到正确的区域端点。其中arn是查询的唯一主键数据源读取后会将arn的值直接作为资源 IDd.SetId写入状态见 resource_data_source.go。属性参考Attribute Reference除了上述参数之外数据源还会导出以下只读属性Computed属性类型说明hybrid_access_enabledbool是否启用了 AWS Lake Formation 混合访问Hybrid Access权限模式。last_modifiedstring数据位置最近一次被修改的日期与时间格式为 RFC 3339 标准时间字符串。role_arnstring数据位置注册时绑定的 IAM 角色 ARN。with_federationbool该资源是否为联邦federated资源。with_privileged_accessbool是否授予调用主体在该已注册数据位置上执行所有受支持 Lake Formation 操作的权限。这些属性与 AWS SDK for Go v2 的DescribeResource返回的ResourceInfo结构体字段一一对应。在 resource_data_source.go 中可以看到映射逻辑hybrid_access_enabled←ResourceInfo.HybridAccessEnabledlast_modified←ResourceInfo.LastModified格式化输出为time.RFC3339role_arn←ResourceInfo.RoleArnwith_federation←ResourceInfo.WithFederationwith_privileged_access←ResourceInfo.WithPrivilegedAccess实战示例从注册到查询的完整配置原文档给出了最小示例直接以 S3 路径 ARN 查询已注册资源data aws_lakeformation_resource example { arn arn:aws:s3:::tf-acc-test-9151654063908211878 }仓库的验收测试resource_data_source_test.go给出了更完整的注册 查询闭环配置可以直接作为生产配置模板# 1. 准备一个 S3 存储桶作为数据位置 resource aws_s3_bucket test { bucket my-lake-bucket } # 2. 创建用于注册的 IAM 角色 resource aws_iam_role test { name lakeformation-registration-role path /test/ assume_role_policy EOF { Version: 2012-10-17, Statement: [ { Action: sts:AssumeRole, Principal: { Service: s3.amazonaws.com }, Effect: Allow, Sid: } ] } EOF } data aws_partition current {} # 3. 为角色授予访问该桶所需的最小 S3 权限 resource aws_iam_role_policy test { name lakeformation-s3-access role aws_iam_role.test.id policy EOF { Version: 2012-10-17, Statement: [ { Effect: Allow, Action: [ s3:GetBucketLocation, s3:ListAllMyBuckets, s3:GetObjectVersion, s3:GetBucketAcl, s3:GetObject, s3:GetObjectACL, s3:PutObject, s3:PutObjectAcl ], Resource: [ arn:${data.aws_partition.current.partition}:s3:::${aws_s3_bucket.test.id}/*, arn:${data.aws_partition.current.partition}:s3:::${aws_s3_bucket.test.id} ] } ] } EOF } # 4. 将数据位置注册到 Lake Formation resource aws_lakeformation_resource test { arn aws_s3_bucket.test.arn role_arn aws_iam_role.test.arn } # 5. 通过数据源读取注册详情 data aws_lakeformation_resource test { arn aws_lakeformation_resource.test.arn } output registered_role { value data.aws_lakeformation_resource.test.role_arn }执行terraform plan与terraform apply后数据源的各项属性即可被下游引用。测试中的断言resource_data_source_test.go验证了数据源的arn/role_arn与aws_lakeformation_resource资源的对应属性值相等且默认情况下hybrid_access_enabled、with_federation、with_privileged_access均为false。底层实现数据源如何读取资源信息该数据源是一个基于terraform-plugin-sdk/v2的 SDK 数据源核心读取逻辑在dataSourceResourceRead函数中resource_data_source.go调用链如下通过meta.(*conns.AWSClient).LakeFormationClient(ctx)获取 Lake Formation 服务客户端构造lakeformation.DescribeResourceInput将用户传入的arn写入ResourceArn字段调用conn.DescribeResource(ctx, input)发起 AWS API 请求处理异常若返回EntityNotFoundException资源未注册记录 WARN 日志并将资源 ID 置空从 Terraform 状态中移除其他错误则通过sdkdiag.AppendErrorf汇总为诊断信息返回校验output与output.ResourceInfo非空空响应同样报错将arn设置为数据源 ID并把ResourceInfo的字段逐一写入状态。值得注意的实现细节last_modified可能缺失代码注释明确说明output not including last modified currentlyresource_data_source.go即当前 AWS API 响应中LastModified字段可能不返回因此写入前做了 nil 判断避免空指针。with_federation/with_privileged_access的守卫逻辑管理资源 resource.go 中对这两个字段也做了 nil 判断。这是因为对于 Glue 连接类型不支持联邦的 ARN如 JDBC 连接AWS 会省略这两个字段若把 nil 强转成false会与用户配置的true产生永久性漂移perpetual drift。数据源侧同样遵循这一守卫保证读回的状态与远端一致。数据源与 aws_lakeformation_resource 资源的关系理解这一对资源/数据源的关系有助于正确使用维度aws_lakeformation_resource资源aws_lakeformation_resource数据源生命周期Create / Read / Delete可注册与注销数据位置仅 Read只读查询底层 APIRegisterResource/DescribeResource/DeregisterResourceDescribeResource参数arn必填、role_arn、use_service_linked_role、hybrid_access_enabled、with_federation、with_privileged_accessarn必填、region可选是否可写是会真实修改 AWS 侧注册状态否管理资源的注册逻辑resource.go中有两个对理解数据源输出很有帮助的行为角色选择配置了role_arn时使用显式 IAM 角色注册未配置时自动回退为UseServiceLinkedRole true即使用 Lake Formation 的服务相关角色。因此数据源输出的role_arn可能是用户指定的角色也可能是AWSServiceRoleForLakeFormationDataAccess这类服务相关角色测试 resource_test.go 中对此有专门断言。AlreadyExistsException幂等处理重复注册同一 ARN 时不会报错仅记录 WARN 日志后继续读取。测试与质量保障仓库为数据源提供了专门的验收测试TestAccLakeFormationResourceDataSource_basicresource_data_source_test.go其关键点包括使用acctest.PreCheckPartitionHasService检查当前分区是否提供 Lake Formation 服务通过TestCheckResourceAttrPair断言数据源与资源之间的arn、role_arn属性值一致对hybrid_access_enabled、with_federation、with_privileged_access断言默认false值固化了对默认行为的契约。此外管理资源侧的测试resource_test.go覆盖了基本注册、disappears、服务相关角色切换SLR↔Role、hybrid_access_enabled与with_privileged_access开启等场景这些测试共同保证了数据源查询结果的准确性。仓库还通过 sweepersweep.go使用ListResources分页器遍历清理测试残留的已注册资源保障 CI 环境的可重复性。常见问题与注意事项arn必须是已注册的 S3 路径 ARN数据源不会自动注册数据位置。若查询未注册的 ARNProvider 会将该数据源从状态中移除d.SetId()后续引用它的属性会报错。此时应先创建aws_lakeformation_resource资源完成注册。region与 Provider 区域的关系Lake Formation 是区域性服务数据位置的注册状态按区域隔离。若资源注册在 A 区域而 Provider 默认区域是 B则需通过region参数显式指定 A 区域否则会查询不到。last_modified可能为空受 AWS API 响应限制该字段可能不返回引用时建议做空值兼容处理。联邦相关字段的语义with_federation为true表示资源是联邦资源对于非联邦能力的 Glue 连接 ARN如 JDBCAWS 可能完全省略该字段Provider 会保留 nil 而不会强行写入false避免漂移。ARN 校验arn参数会经过verify.ValidARN校验传入非法 ARN 会在terraform plan阶段直接报错而不是等到 API 调用时才失败。【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表