You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 14:12:38