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

使用Bash嵌入Python创建AWS Secret时遇键值转换错误求助

问题根源分析

你的错误核心是长文本(私钥、CSR)中的特殊字符(换行、引号等)在Bash插值过程中破坏了JSON语法结构,导致AWS Secrets Manager收到的不是合法的JSON对象,无法解析为键值对。短字符串能正常工作是因为它们不含这类特殊字符,不会破坏JSON格式。


解决方案

一、修复AWS CLI调用问题

不要直接在Bash中拼接JSON字符串,改用jq工具自动处理特殊字符转义,生成合法的JSON:

export keyfile="path/to/your/keyfile"
export csrfile="path/to/your/csrfile"
export configfile="${key_algorithm}-$line.cfn"

# 用jq生成合法JSON,自动转义换行、引号等特殊字符
aws secretsmanager create-secret --name marwahas51 \
    --description "Values for this environments wildcard certifcate in ACM" \
    --secret-string "$(jq -n \
        --arg prvpem "$(<"$keyfile")" \
        --arg csr "$(<"$csrfile")" \
        --arg config "$(<"$configfile")" \
        '{Privatekey: $prvpem, csr: $csr, config: $config}')" \
    --kms-key-id "alias/SecretsMgr" \
    --tags "Key=Environment,Value=Dev"

关键说明:

  • $(<"$file"):读取文件原始内容(保留换行符)
  • jq:自动处理所有特殊字符的转义,确保输出的JSON语法完全合法

二、修复Bash嵌入Python的问题

避免让Bash直接将变量插值到Python脚本中,改用命令行参数传递文件路径,让Python自行读取内容,彻底规避Bash的字符转义问题:

cat << EOF > pyscript.py
#!/usr/bin/python3 -tt
import json
import boto3
import sys

# 从命令行参数获取文件路径
csr_file, config_file, prvpem_file = sys.argv[1], sys.argv[2], sys.argv[3]

# 读取文件内容的工具函数
def read_file(path):
    with open(path, 'r') as f:
        return f.read()

# 构造合法的字典对象
key_info = {
    "csr": read_file(csr_file),
    "config": read_file(config_file),
    "PrivateKey": read_file(prvpem_file)
}

client = boto3.client('secretsmanager')
response = client.create_secret(
    Name='marw',
    KmsKeyId='alias/SecretsMgr',
    SecretString=json.dumps(key_info)
)
print(response)
EOF

chmod 770 pyscript.py
# 传递文件路径作为参数执行脚本
./pyscript.py "$csrfile" "${key_algorithm}-$line.cfn" "$keyfile"

printf "This is BASH again\n"

备选方案:通过环境变量传递内容

如果必须传递内容而非文件路径,用printf保留原始换行后导出为环境变量:

# 导出环境变量,保留原始换行
export CSR_CONTENT="$(printf "%s" "$(<"$csrfile")")"
export CONFIG_CONTENT="$(printf "%s" "$(<"${key_algorithm}-$line.cfn")")"
export PRVPEM_CONTENT="$(printf "%s" "$(<"$keyfile")")"

cat << EOF > pyscript.py
#!/usr/bin/python3 -tt
import json
import boto3
import os

key_info = {
    "csr": os.environ['CSR_CONTENT'],
    "config": os.environ['CONFIG_CONTENT'],
    "PrivateKey": os.environ['PRVPEM_CONTENT']
}

client = boto3.client('secretsmanager')
response = client.create_secret(
    Name='marw',
    KmsKeyId='alias/SecretsMgr',
    SecretString=json.dumps(key_info)
)
print(response)
EOF

chmod 770 pyscript.py
./pyscript.py

printf "This is BASH again\n"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 06:43:29