AWS开发工具包AmazonCloudFormationClient模板版本问题

时间:2016-04-07 19:04:24

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

我正在使用最新版本的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"所以我不明白这个版本号的位置。

以下是我使用的不同代码段的片段:

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));

1 个答案:

答案 0 :(得分:1)

我终于找到了解决方案。 AWS抛出的错误消息与此问题无关。

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