【问题标题】:AWS SDK AmazonCloudFormationClient template version issueAWS SDK AmazonCloudFormationClient 模板版本问题
【发布时间】:2016-04-07 19:04:23
【问题描述】:

我正在使用最新版本的 AWS Java SDK (1.10.67),并且正在探索使用 CloudFormation 服务并使用 Java API 创建堆栈。我已经使用 AWS 控制台成功创建了堆栈,但在使用 API 时遇到了问题。

无论我使用 AmazonCloudFormationClient 调用什么方法,它都会引发相同的错误(“操作”名称会根据我调用的方法而变化)。我还注意到,如果我没有定义 templateURL 或 templateBody,我会得到同样的错误,所以我想知道它是否无法解析我的模板文件。但是 AWS 控制台可以很好地读取模板。

com.amazonaws.AmazonServiceException:找不到版本 2010-05-15 的操作 DescribeStackResources(服务:AmazonCloudFormation;状态代码:400;错误代码:InvalidAction;请求 ID:**** *)

尤其是在上面的调用中,我很困惑为什么它甚至会查看模板版本,因为它应该只是抓取先前创建的堆栈。我使用的模板具有“2010-09-09”的最新模板版本,所以我不明白它从哪里获得该版本号。

以下是我使用过的不同代码片段的 sn-ps:

GetTemplateSummaryRequest templateSummaryRequest = new GetTemplateSummaryRequest()
    .withTemplateURL("https://s3.amazonaws.com/{bucket}/EC2_POC_CloudFormation.template");
GetTemplateSummaryResult templateSummary = cfClient.getTemplateSummary(templateSummaryRequest);

CreateStackRequest stack = new CreateStackRequest()
    .withStackName(stackName)
    //.withTemplateURL("https://s3.amazonaws.com/{bucket}/EC2_POC_CloudFormation.template")
    .withTemplateBody(cloudFormationTemplateString)
    .withParameters(stackParams);
cfClient.createStack(stack);

DescribeStackResourcesRequest stackResourceRequest = new DescribeStackResourcesRequest()
    .withStackName(existingStackName);
for (StackResource resource : cfClient.describeStackResources(stackResourceRequest).getStackResources()) {
    LOGGER.info(resource.getStackName()+" - "+resource.getResourceType()+", "+resource.getResourceStatus());
}

任何帮助或见解都将不胜感激,因为我已经花了 5 多个小时尝试不同的事情。


解决方案:
将 Spring 与 bean 一起使用:

<bean id="awsproperties" class="com.amazonaws.auth.PropertiesCredentials">
    <constructor-arg type="java.io.File" value="classpath:AwsCredentials.properties"/>
</bean>

<bean id="cfBean" class="com.amazonaws.services.cloudformation.AmazonCloudFormationClient">
    <constructor-arg ref="awsproperties" type="com.amazonaws.auth.AWSCredentials"/>
    <property name="endpoint" value="cloudformation.us-east-1.amazonaws.com"/>     
</bean> 


使用 Java:

AmazonCloudFormation cfClient = new AmazonCloudFormationClient(awsCredentials);
cfClient.setRegion(Region.getRegion(Regions.US_EAST_1));

【问题讨论】:

  • 您使用什么来加载您的凭据?默认凭据加载器? (带有凭证文件路径的类路径条目?)如果是这样,您确定您正在加载正确的凭证集并且没有意外指向不同的环境(UAT、Test 等)吗?
  • 我的项目使用的是 Spring,所以我定义了一个 bean 来创建我的客户端对象。它通过传递使用包含 accessKey 和 secretKey 的属性文件定义的 AWSCredentials 对象来构造它。我的问题是我忘记将端点设置为指向该区域。我用两种设置区域的方法编辑了我的原始帖子。

标签: java amazon-web-services amazon-cloudformation aws-java-sdk


【解决方案1】:

我终于找到了解决办法。 AWS 抛出的错误消息与问题完全无关。

对于以后遇到此问题的人来说,问题出在我的 AmazonCloudFormationClient 配置中。我忘记了设置区域。一旦我这样做了,问题就消失了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-24
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    • 2023-03-24
    相关资源
    最近更新 更多