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

如何在boto3的AWS SSM Send Command中传递本地Python变量值

实现方案

直接把PEM格式的证书原文拼接进Shell命令会因为证书自带的换行、特殊字符触发Shell解析错误,最稳妥的实现方式是本地先对证书内容做一次base64编码,传入实例后再解码写入目标路径,全程不需要处理复杂的转义逻辑。

可直接复用的代码如下:

import base64
import boto3

ssm_client = boto3.client('ssm')
# 存储PEM格式证书的本地变量
Cert = "-----BEGIN CERTIFICATE-----.........-----END CERTIFICATE-----"
# 本地将证书编码为无特殊字符的base64字符串
cert_b64_str = base64.b64encode(Cert.encode("utf-8")).decode("utf-8")
# 自定义EC2实例上证书的存放路径
cert_save_path = "/etc/ssl/certs/your_service.crt"

response = ssm_client.send_command(
    InstanceIds=[healthy_instance[0]],
    DocumentName="AWS-RunShellScript",
    Parameters={
        "commands": [
            # 将传入的base64字符串解码写入目标文件
            f"echo '{cert_b64_str}' | base64 -d > {cert_save_path}",
            # 设置证书文件权限,按需调整
            f"chmod 644 {cert_save_path}",
            # 如需重载依赖证书的服务,追加对应命令即可,例如:
            # "systemctl reload nginx"
        ]
    },
)

注意事项

  • 禁止直接把PEM证书原文拼接到echo命令中:PEM的多行结构、特殊符号会被Shell截断解析,大概率出现写入证书不全、格式损坏的问题,排查成本极高。
  • 如果需要同步下发证书私钥,逻辑完全一致:本地将私钥内容做base64编码后传入,实例上解码写入对应私钥路径即可,注意私钥文件权限需要设置为600,避免因权限过宽导致服务启动失败。
  • AWS-RunShellScript单条命令长度上限足够容纳证书、私钥的base64编码内容,不需要做分片处理。
  • 命令下发后可调用ssm_client.get_command_invocation接口查询执行状态、输出日志,确认证书写入结果符合预期。

不要尝试手动替换PEM内容里的换行符、转义特殊字符来适配Shell语法,这种写法容错性极差,后续证书更新时很容易出故障。

内容的提问来源于stack exchange,提问作者achilles59

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 10:30:55