如何在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
相关产品推荐
相关产品推荐

