在AWS Lambda函数中通过ARN查询ACM证书时,获取DomainValidationOptions值触发KeyError的问题求助
解决ACM证书DomainValidationOptions导出的KeyError问题
咱们先直接定位错误原因:你遇到的KeyError: 0,是因为AWS ACM的describe_certificate接口返回的Certificate字段是一个字典对象,而不是列表——你多写了[0]索引,这才导致了键错误。
先理清API返回结构
调用client_acm.describe_certificate(CertificateArn=acm_arn)后,返回的核心结构大概是这样的(简化版):
{ "Certificate": { "DomainName": "example.com", "DomainValidationOptions": [ # 这里才是列表,对应每个域名的验证配置 { "DomainName": "example.com", "ResourceRecord": { "Name": "_abc123.example.com.", "Type": "CNAME", "Value": "_xyz789.acm-validations.aws." }, # 其他验证相关字段... }, # 如果证书包含多个域名,这里会有更多项 ] } }
修正后的代码
根据你Lambda中做DNS验证的需求,分两种场景处理:
场景1:只需要第一个域名的验证记录
如果你的证书只对应一个域名,或者只需要第一个验证项,可以这样写:
acm_describe = client_acm.describe_certificate(CertificateArn=acm_arn) # 注意:Certificate是字典,不需要[0]索引 cert_details = acm_describe['Certificate'] # DomainValidationOptions是列表,取第一个验证项 first_validation = cert_details['DomainValidationOptions'][0] resource_record = first_validation['ResourceRecord'] acm_name = resource_record['Name'] acm_type = resource_record['Type'] acm_value = resource_record['Value']
场景2:遍历所有域名的验证记录
如果证书包含多个域名(比如带通配符的证书),需要处理所有验证项,可以用循环:
acm_describe = client_acm.describe_certificate(CertificateArn=acm_arn) cert_details = acm_describe['Certificate'] for validation in cert_details['DomainValidationOptions']: # 先判断是否存在ResourceRecord(避免邮箱验证场景下的KeyError) if 'ResourceRecord' in validation: resource_record = validation['ResourceRecord'] acm_name = resource_record['Name'] acm_type = resource_record['Type'] acm_value = resource_record['Value'] # 在这里处理每条验证记录,比如写入DNS print(f"处理域名{validation['DomainName']}的DNS记录:{acm_type} {acm_name} {acm_value}")
额外注意事项
- 一定要检查
ResourceRecord是否存在:如果证书的验证方式是邮箱验证,而不是DNS验证,这个字段就不会出现,直接访问会触发KeyError。 - 可以结合
get()方法做更安全的取值,比如validation.get('ResourceRecord', {}),避免直接索引的风险。
内容的提问来源于stack exchange,提问作者Naeem
相关产品推荐
相关产品推荐

