2

我正在使用最新版本的AWS Java SDK(1.10.67),並且正在探索使用CloudFormation服務並使用Java API創建堆棧。我已經使用AWS控制檯成功創建了堆棧,但在使用API​​時遇到了問題。AWS SDK AmazonCloudFormationClient模板版本問題

不管我使用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 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)); 
+0

你用什麼來加載你的憑證?默認憑證加載器? (類路徑入口與憑證文件的路徑?)如果是這樣,你確定你正在加載正確的憑證集並且不會意外指向不同的環境(UAT,Test等)? – Andonaeus

+0

我的項目使用Spring,所以我定義了一個bean來創建我的客戶端對象。它通過傳遞使用包含accessKey和secretKey的屬性文件定義的AWSCredentials對象來構造它。我的問題是我忘了將端點設置爲指向該區域。我用兩種方式編輯我的原始帖子來設置區域。 – Bryce

回答

1

我終於能夠找到解決方案。 AWS引發的錯誤消息與問題無關。

對於將來遇到此問題的人來說,問題出在我的AmazonCloudFormationClient配置中。我忘記了設置區域。一旦我這樣做,問題就消失了。