teratail header banner
teratail header banner
質問するログイン新規登録

質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%
AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

1回答

975閲覧

SAMテンプレート(Cloud Formation) Fn::Subの使い方(リソースパラメータの参照)

dbfreak

総合スコア20

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2023/06/01 10:29

0

0

実現したいこと

aws samでAPIGW用テンプレートを作成しています。
デプロイ前にsam validate --lintでチェックしたのですが、Fn::Subの部分でエラーが出てしまいました。
エラー2件出ています。
①${ServerlessRestApi}
②${RestApi.Properties.StageName}

①については別件として投稿しておりますので
②の部分についてどう修正すれば良いのかご教示ください。

前提

省略

発生している問題・エラーメッセージ

PS C:\Users\luna\devRoot\mybank-sample> sam validate --lint E6001 Output ApigwInfo is not an object C:\Users\luna\devRoot\mybank-sample\template.yaml:54:3 E6001 Output Description has invalid property Fn::Sub C:\Users\luna\devRoot\mybank-sample\template.yaml:56:5 E1019 Parameter ServerlessRestApi for Fn::Sub not found at Outputs/Description/Value/Fn::Sub C:\Users\luna\devRoot\mybank-sample\template.yaml:58:5 ★↓該当エラー箇所★ E1019 ★Parameter RestApi.Properties.StageName for Fn::Sub not found★ at Outputs/Description/Value/Fn::Sub C:\Users\luna\devRoot\mybank-sample\template.yaml:58:5 Error: Linting failed. At least one linting rule was matched to the provided template.

該当のソースコード

template.yaml

1AWSTemplateFormatVersion: '2010-09-09' 2Transform: AWS::Serverless-2016-10-31 3Description: "Sample SAM Template for local-deploy-sample1" 4 5Resources: 6 RestApi: 7 Type: AWS::Serverless::Api 8 Properties: 9 Name: my-bank-api-name 10 Description: RestApi-no-Properties-no-Description 11 EndpointConfiguration: REGIONAL 12 StageName: mybank-stage #base-path to awaseru 13 OpenApiVersion: 3.0.2 14 DefinitionUri: ./openapi.yaml 15・・・省略・・・ 16Outputs: 17 ApigwInfo: 18 Description: 19 Fn::Sub: ${RestApi} 20 Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/${RestApi.Properties.StageName}/"

試したこと

awsリファレンス Fn::Subは確認しました。

If you specify resource attributes, such as ${MyInstance.PublicIp}, CloudFormation returns the same values as if you used the Fn::GetAtt intrinsic function.
と記載があるので、${RestApi.Properties.StageName}もOKかと思った次第です。

補足情報(FW/ツールのバージョンなど)

省略

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dbfreak

2023/06/01 13:36

=============== ①については別件として投稿しておりますので ②の部分についてどう修正すれば良いのかご教示ください。 =============== 本文に記載のとおり、未投稿の②に対するQAとなりますのでご指摘には当たらないと思います。
guest

回答1

0

ベストアンサー

AWSのCloudFormationテンプレートまたはSAMテンプレートに使用するSubやRef、GetAtt関数が返すものはリソースごとに違うというのを意識するといいかと思います。
今回の場合は"AWS::Serverless::Api"というリソースなので、ドキュメントを見に行くと、戻り値というセクションがあるので参考にしてください。
https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/sam-resource-api.html#sam-resource-api-return-values

上記のドキュメントに従うと、
RestAPIのIDとRootパスのリソースIDしか取得できません。(原因②)
!Subは!Refと同じ値を使用します
そのため下記のような記載要領になるかと思います

yaml

1Outputs: 2 ApigwInfo: 3 Description: !Sub "${RestApi}" 4 Value: !Sub "https://${RestApi}.execute-api.${AWS::Region}.amazonaws.com/mybank-stage/"

なおご記載の${ServerlessRestApi}についてはリソース上存在しないので、エラーになると思います(原因①)

補足ですがいわゆるテンプレートの${RestApi}というのは論理IDというのですが、プログラミング言語でいうと変数にあたります。
他にもテンプレートの引数のようなParametersセクションやFn::ImportValueといった別のテンプレートでOutputsで定義したものを引き込む便利なものもあります。

yaml

1AWSTemplateFormatVersion: '2010-09-09' 2Transform: AWS::Serverless-2016-10-31 3 4Parameters: 5 パラメータ1: 6 Type: String 7 Default: 許可された値1 8 AllowedValues: 9 - 許可された値1 10 - 許可された値2 11 - 許可された値3 12 Description: パラメータ1という引数に許可された値1~3という値のみ入れることができます 13 ApiStage: 14 Type: String 15 Description: APIのステージ 16 17Resources: 18 リソースの論理ID1: 19 Type: AWS::Serverless::Api 20 Properties: 21 Name: !Sub "${パラメータ1}-api" 22 Description: 23 Fn::ImportValue: "アウトプット1" 24 StageName: !Ref ApiStage 25・・・ 26Outputs: 27 アウトプット2: 28 Description: "CloudFormationのアウトプット" 29 Value: !Sub "https://${リソースの論理ID1}.execute-api.${AWS::Region}.amazonaws.com/${ApiStage}/"

投稿2023/06/16 15:14

tamanegine

総合スコア177

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問