使用Boto3创建API Gateway自定义域名时,如何等待ACM证书初始化完成?
如何编程等待API Gateway自定义域名关联的ACM证书初始化完成
哥们,你碰到的这个情况我之前也踩过坑——API Gateway的create_domain_name()返回的domainNameStatus确实会提前变成AVAILABLE,但背后关联的ACM证书其实还在后台初始化,得等个几十分钟才能正常用。分享两个靠谱的编程式等待方法给你:
1. 先确认ACM证书本身已签发就绪
首先得确保你的ACM证书本身已经是ISSUED状态(如果是刚申请的新证书,得先完成域名验证这一步)。用Boto3的ACM客户端就能轻松查询:
import boto3 import time acm_client = boto3.client('acm', region_name='你的证书所在区域') def wait_for_acm_cert_ready(cert_arn): while True: cert_details = acm_client.describe_certificate(CertificateArn=cert_arn) current_status = cert_details['Certificate']['Status'] if current_status == 'ISSUED': print("ACM证书已经签发完成啦") break elif current_status in ['FAILED', 'INVALID']: raise Exception(f"糟了,ACM证书状态异常:{current_status}") print(f"当前ACM证书状态:{current_status},再等等...") time.sleep(60) # 每分钟查一次就行
2. 等待API Gateway侧的证书初始化完成
就算ACM证书已经签发好了,API Gateway在关联证书时还有个内部的初始化流程,这时候得看域名配置里的certificateStatus字段,而不是顶级的domainNameStatus。用get_domain_name()接口轮询这个状态就行:
apigw_client = boto3.client('apigateway', region_name='你的API Gateway区域') def wait_for_apigw_cert_initialized(domain_name): while True: domain_details = apigw_client.get_domain_name(domainName=domain_name) # 遍历所有域名配置(比如同时支持HTTP和HTTPS的情况) for config in domain_details['domainNameConfigurations']: cert_status = config['certificateStatus'] if cert_status == 'AVAILABLE': print(f"API Gateway侧证书初始化完成:{config['endpointType']}") return elif cert_status == 'FAILED': raise Exception(f"API Gateway证书初始化失败了:{cert_status}") print("API Gateway证书还在初始化中,再等5分钟看看...") time.sleep(300) # 这个过程慢,每5分钟查一次足够
小提醒
- 调用顺序要注意:先等ACM证书签发完成,再等API Gateway侧的初始化,不然可能白等。
- 记得给等待逻辑加个超时时间,比如最多等1小时,避免无限循环卡着。
- 如果你的证书是给边缘优化域名用的(关联CloudFront),那证书必须在us-east-1区域,别搞混了region参数。
另外还有个间接方法:如果是边缘优化域名,也可以查CloudFront分发的状态,等分发变成Deployed,这也能确认证书已经生效了。
内容的提问来源于stack exchange,提问作者Edward Q. Bridges
相关产品推荐
相关产品推荐

