CFN资源提供程序测试创建S3桶时出现IllegalLocationConstraintException报错
问题解决方案
根本原因
这个报错由两个因素共同触发:
- S3的
CreateBucketAPI有特殊区域校验规则:请求发送到的S3服务端点所属区域,必须和CreateBucketConfiguration中指定的LocationConstraint一致;如果使用us-east-1区域的端点,不需要传入LocationConstraint参数,传了反而会报错。 cfn test调用SAM Local运行测试时,默认不会继承你本地AWS CLI的区域配置,你初始化S3客户端时没有显式指定区域,导致SDK默认将请求发送到us-east-1的S3端点,和你指定的us-east-2位置约束不匹配。
你移除LocationConstraint参数后依旧报错,是因为SDK会隐式读取运行环境的默认区域作为位置约束,而SAM Local环境中默认区域参数为空,所以会提示undefined不兼容。
修复步骤
步骤1:初始化S3客户端时显式指定区域,和位置约束保持一致
修改你的代码,创建S3客户端时传入region_name参数,保证和LocationConstraint的取值完全相同:
# 以us-east-2为例 s3 = session.client("s3", region_name="us-east-2") s3.create_bucket( Bucket='mybucket123', CreateBucketConfiguration={'LocationConstraint': 'us-east-2'} )
如果选择使用us-east-1区域测试,不需要传入CreateBucketConfiguration参数:
s3 = session.client("s3", region_name="us-east-1") s3.create_bucket(Bucket='mybucket123')
步骤2:给测试环境显式配置区域参数
运行cfn test前先设置环境变量指定默认区域,避免SAM Local使用空默认值:
export AWS_DEFAULT_REGION=us-east-2 cfn test
你也可以在资源Provider的测试配置文件中添加AWS_DEFAULT_REGION环境变量声明,无需每次手动设置。
可选临时方案
如果本地测试不需要指定特定区域,统一使用us-east-1作为测试区域即可,不需要调整其他配置就能规避这个S3的特殊校验规则。
内容的提问来源于stack exchange,提问作者user1148920
相关产品推荐
相关产品推荐

