在Scala(AWS Glue环境)中访问SSM的SecureString参数
解决AWS Glue Scala脚本中获取SSM SecureString参数的问题
首先,你之前用的software.amazon.awscdk.services.ssm是AWS CDK(基础设施即代码工具)的库,它是用来在部署阶段创建/管理SSM参数的,不是用来在运行时(比如Glue作业执行时)读取参数的——这就是你遇到编译错误的核心原因!
Scala运行在JVM上,完全可以直接使用AWS SDK for Java来调用SSM服务,这是最正确的方式。下面给你一步步的解决方案:
1. 必要的IAM权限配置
首先确保你的Glue作业执行角色有以下权限:
ssm:GetParameter:允许读取SSM参数kms:Decrypt:允许解密SecureString类型的参数(因为SecureString是用KMS CMK加密的,默认用AWS管理的CMK,或者你自定义的CMK)
可以给角色添加类似这样的IAM策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ssm:GetParameter", "Resource": "arn:aws:ssm:你的区域:你的账号ID:parameter/你的参数名" }, { "Effect": "Allow", "Action": "kms:Decrypt", "Resource": "arn:aws:kms:你的区域:你的账号ID:key/你的CMK密钥ID" } ] }
2. 选择合适的AWS SDK版本
Glue 2.x(对应Scala 2 + Spark 2.4)环境预装了AWS SDK for Java v1的部分模块,你可以直接使用v1的SSM客户端;如果想用新版的v2 SDK,需要在Glue作业中添加对应的依赖Jar包。
方案A:使用AWS SDK for Java v1(无需额外依赖)
这是最省心的方式,因为Glue已经预装了相关库。以下是完整的Scala代码示例:
import com.amazonaws.services.simplesystemsmanagement.AWSSimpleSystemsManagementClientBuilder import com.amazonaws.services.simplesystemsmanagement.model.GetParameterRequest object SfdcExtractData { def main(sysArgs: Array[String]): Unit = { println("Starting job...") // 初始化SSM客户端(自动使用Glue作业的执行角色凭证) val ssmClient = AWSSimpleSystemsManagementClientBuilder.defaultClient() // 构造获取参数的请求,指定参数名并开启解密 val parameterRequest = new GetParameterRequest() .withName("my-secure-parameter-name") .withWithDecryption(true) // 获取参数并打印值(实际使用时替换为你的业务逻辑) try { val parameterResponse = ssmClient.getParameter(parameterRequest) val secureValue = parameterResponse.getParameter.getValue println(s"Successfully retrieved secure parameter value: $secureValue") } catch { case e: Exception => println(s"Error retrieving parameter: ${e.getMessage}") throw e // 抛出异常终止作业,根据你的需求调整 } finally { ssmClient.shutdown() // 关闭客户端释放资源 } } }
方案B:使用AWS SDK for Java v2(需要添加依赖)
如果你想使用更现代的v2 SDK,需要在Glue作业的Jar libraries中添加以下依赖(可以从Maven Central下载对应的Jar包,或者用Glue的依赖管理功能):
software.amazon.awssdk:ssm:2.20.0(版本可以根据Glue环境兼容情况调整)software.amazon.awssdk:regions:2.20.0
对应的Scala代码示例:
import software.amazon.awssdk.regions.Region import software.amazon.awssdk.services.ssm.SsmClient import software.amazon.awssdk.services.ssm.model.GetParameterRequest object SfdcExtractData { def main(sysArgs: Array[String]): Unit = { println("Starting job...") // 指定你的AWS区域 val region = Region.US_EAST_1 val ssmClient = SsmClient.builder().region(region).build() val parameterRequest = GetParameterRequest.builder() .name("my-secure-parameter-name") .withDecryption(true) .build() try { val parameterResponse = ssmClient.getParameter(parameterRequest) val secureValue = parameterResponse.parameter().value() println(s"Successfully retrieved secure parameter value: $secureValue") } catch { case e: Exception => println(s"Error retrieving parameter: ${e.getMessage}") throw e } finally { ssmClient.close() } } }
3. 关键注意事项
- 版本指定:如果你的SSM参数有版本,在
GetParameterRequest中可以用withVersion(v1)或version()(v2)指定版本号,和你之前尝试的CDK方法类似,但这是可选的,不指定会获取最新版本。 - 凭证自动加载:Glue作业的执行角色会自动提供AWS凭证,所以不需要在代码中硬编码Access Key/Secret Key,客户端会自动从环境变量/实例元数据中获取。
- 异常处理:实际生产环境中,建议添加更细致的异常处理(比如参数不存在、权限不足等特定异常),避免作业意外终止。
内容的提问来源于stack exchange,提问作者ronald mcdolittle
相关产品推荐
相关产品推荐

