View a markdown version of this page

CloudFormation 言語拡張機能のサポート - AWS Serverless Application Model

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

CloudFormation 言語拡張機能のサポート

は AWS SAM CLI、、、Fn::ForEach、および Fn::LengthFn::ToJsonStringFn::FindInMapを含む AWS::LanguageExtensions変換を使用するテンプレートをサポートしますDefaultValue。これらのコンストラクトに関する完全なリファレンス情報については、「 AWS CloudFormation ユーザーガイド」の「AWS::LanguageExtensions transform」を参照してください。

AWS SAM テンプレートで言語拡張機能を使用するには、 の前に TransformセクションAWS::LanguageExtensionsに を一覧表示しますAWS::Serverless-2016-10-31

Transform: - AWS::LanguageExtensions - AWS::Serverless-2016-10-31

が AWS SAM CLIテンプレートの TransformセクションAWS::LanguageExtensionsを検出、ローカル処理にオプトインすると、 AWS SAM 変換を実行する前に言語拡張コンストラクトがローカルで拡張されます。これにより、sam build、、sam packagesam deploy、、sam syncsam validatesam local invoke、および sam local start-lambdasam local start-api、これらのコンストラクトを使用するテンプレートを操作できます。

ローカル処理はデフォルトでオフになっています。オフにすると AWS SAM CLI、 はテンプレートを変更せずに渡し、デプロイ時にAWS::LanguageExtensions変換サーバー側 CloudFormation を処理します。アクティベーション方法については、「」を参照してください言語拡張機能の有効化

拡張は、有効にすると 2 つのフェーズで行われます。

  1. フェーズ 1 (言語拡張)Fn::ForEachループが展開され、組み込み関数が可能な限り解決され、テンプレートが標準に変換されます CloudFormation。

  2. フェーズ 2 (AWS SAM 変換) — 展開されたテンプレートは、通常どおり AWS SAM Translator によって処理されます。

AWS::LanguageExtensions変換サーバー側 CloudFormation を処理するため、元のテンプレート (Fn::ForEachそのまま) は CloudFormation デプロイ用に保持されます。

言語拡張機能の有効化

のローカル処理AWS::LanguageExtensionsは、コマンドごとにオプトインされます。優先度順にリストされた 3 つの同等のアクティベーション方法があります。

  1. CLI フラグ — 1 回の呼び出し--language-extensionsで渡します。

    sam build --language-extensions sam package --language-extensions ... sam deploy --language-extensions ...

    --no-language-extensions は明示的に無効にsamconfig.tomlし、以下で説明する環境変数と の両方を上書きします。

  2. samconfig.toml — プロジェクトごとに選択肢を保持します。

    [default.build.parameters] language_extensions = true [default.package.parameters] language_extensions = true [default.deploy.parameters] language_extensions = true [default.sync.parameters] language_extensions = true [default.local_invoke.parameters] language_extensions = true [default.local_start_api.parameters] language_extensions = true [default.local_start_lambda.parameters] language_extensions = true [default.validate.parameters] language_extensions = true

    samconfig.toml エントリはコマンドのデフォルトとしてロードされるため、フラグが渡されたかのように有効になり、環境変数を優先します。

  3. 環境変数 — 現在のシェルに対して を有効にするSAM_CLI_ENABLE_LANGUAGE_EXTENSIONS=1ように設定されます。

    export SAM_CLI_ENABLE_LANGUAGE_EXTENSIONS=1 sam build sam local invoke MyFunction

    Truthy 値 (大文字と小文字を区別しない) は 1true、および ですyes。空の文字列を含む他のものはオフとして扱われます。環境変数は、 CLIフラグも 値もsamconfig.toml設定されていない場合にのみ参照されます。

重要

各コマンドには独自のアクティベーションが必要です。--language-extensions に渡すと、後で に伝達sam buildされませんsam local invoke。ローカル処理はコマンドの呼び出しごとに決定されます。環境変数またはsamconfig.tomlエントリを使用して、 フラグを繰り返すことなくコマンド間で を有効にします。

Fn::ForEach

Fn::ForEach は、単一のテンプレート定義から複数のリソース、条件、または出力を生成します。

Transform: - AWS::LanguageExtensions - AWS::Serverless-2016-10-31 Parameters: ServiceNames: Type: CommaDelimitedList Default: "Users,Orders,Products" Resources: Fn::ForEach::Services: - Name - !Ref ServiceNames - ${Name}Function: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: python3.12 CodeUri: ./services/${Name}

を実行すると、これを UsersFunctionOrdersFunction、および にsam build拡張しProductsFunction、それぞれがそれぞれのソースディレクトリから構築されます。

動的アーティファクトプロパティ

パッケージ化可能なプロパティがループ変数 ( など./services/${Name}) を使用する場合、 は CloudFormation Mappings各コレクション値を Amazon S3 にマッピングするセクション AWS SAM CLIを生成しますURI。Fn::ForEach 本文は を使用するように書き換えられるFn::FindInMapため、 はデプロイ時に正しいアーティファクトを解決 CloudFormation できます。

認識されたアーティファクトプロパティは、今日書きsam package換えられたものと同じです。これには、以下が含まれます。

によって認識される動的アーティファクトプロパティ AWS SAM CLI
リソースタイプ プロパティ

AWS::Serverless::Function

CodeUri, ImageUri

AWS::Serverless::LayerVersion

ContentUri

AWS::Serverless::Api

DefinitionUri

AWS::Serverless::HttpApi

DefinitionUri

AWS::Serverless::StateMachine

DefinitionUri

AWS::Serverless::GraphQLApi

SchemaUri, CodeUri

AWS::Serverless::Application

Location

AWS::Lambda::Function

Code, Code.ImageUri

AWS::Lambda::LayerVersion

Content

AWS::ApiGateway::RestApi

BodyS3Location

AWS::ApiGatewayV2::Api

BodyS3Location

AWS::AppSync::GraphQLSchema

DefinitionS3Location

AWS::AppSync::Resolver

RequestMappingTemplateS3Location, ResponseMappingTemplateS3Location, CodeS3Location

AWS::AppSync::FunctionConfiguration

RequestMappingTemplateS3Location, ResponseMappingTemplateS3Location, CodeS3Location

AWS::StepFunctions::StateMachine

DefinitionS3Location

AWS::ElasticBeanstalk::ApplicationVersion

SourceBundle

AWS::Glue::Job

Command.ScriptLocation

AWS::CloudFormation::Stack

TemplateURL

AWS::CloudFormation::StackSet

TemplateURL

AWS::CloudFormation::ModuleVersion

ModulePackage

AWS::CloudFormation::ResourceVersion

SchemaHandlerPackage

点線プロパティ ( Command.ScriptLocationAWS::Glue::Jobまたは などAWS::Lambda::Function) Code.ImageUriの場合、値はリソース上のネストされた場所で読み書きされます。生成されたマッピング名は、プロパティパスのリーフセグメントのみを使用します。

プロパティがループテンプレートの場合、マッピング名は です SAM<LeafProperty><LoopName> (例: SAMCodeUriServicesまたは SAMScriptLocationJobs)。

重要

お客様が作成したマッピングは、これらのSAM*プレフィックスで開始しないでください。 用に予約されています AWS SAM CLI。「制限事項」を参照してください。

たとえば、 の後sam package:

Mappings: SAMCodeUriServices: Users: CodeUri: s3://my-bucket/abc123 Orders: CodeUri: s3://my-bucket/def456 Products: CodeUri: s3://my-bucket/ghi789 Resources: Fn::ForEach::Services: - Name - !Ref ServiceNames - ${Name}Function: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: python3.12 CodeUri: !FindInMap [SAMCodeUriServices, !Ref Name, CodeUri]

ForEach 本文ごとに複数のリソース

1 つのFn::ForEach本文は、反復ごとに複数のリソースを出力できます。各リソースは、コレクション値ごとに生成されます。

Resources: Fn::ForEach::Tables: - TableName - [Users, Orders, Products] - ${TableName}Table: Type: AWS::DynamoDB::Table Properties: TableName: !Sub "${AWS::StackName}-${TableName}" # ... ${TableName}StreamProcessor: Type: AWS::Serverless::Function Properties: CodeUri: stream-processors/${TableName}/ Events: DDBStream: Type: DynamoDB Properties: Stream: !GetAtt - !Sub "${TableName}Table" - StreamArn

マッピング名の衝突解決

同じFn::ForEach本文内の 2 つのリソースが同じ動的アーティファクトプロパティを宣言する場合 (たとえば、 Apiと の両方が StateMachineを使用DefinitionUri)、 AWS SAM CLIはリソース論理 ID テンプレートの静的部分から取得したサフィックスを追加して、マッピング名を一意に保ちます。

衝突サフィックスを使用して名前をマッピングする例
リソーステンプレート プロパティ マッピング名

${Svc}Api

DefinitionUri

SAMDefinitionUriServicesApi

${Svc}StateMachine

DefinitionUri

SAMDefinitionUriServicesStateMachine

衝突がない場合、ベース名 ( などSAMDefinitionUriServices) が使用されます。

パラメータベースのコレクション

Fn::ForEach コレクションがパラメータリファレンス ( など!Ref ServiceNames) であり、ループ本文が動的アーティファクトプロパティ ( などCodeUri: ./services/${Name}) を使用する場合、 AWS SAM CLIで説明されているSAM*マッピングを生成するにはコレクション値が必要です動的アーティファクトプロパティ。テンプレートを処理するときに、以下から解決されます。

  1. --parameter-overrides コマンドに渡されます AWS SAM CLI。

  2. テンプレート内のパラメータDefaultの値。

重要

SAM* マッピングはパッケージ時にベイクされるため、パラメータ値を変更するたびに (新しいサービスを追加するときなど) 再パッケージ化する必要があります。これにより、マッピングに新しい値のエントリが含まれます。これは、 パラメータが動的アーティファクトループを駆動する場合にのみ適用されます。他のパラメータオーバーライドは、デプロイ時に通常どおり変更できます。

# Package with the values you intend to deploy with sam package --language-extensions --parameter-overrides ServiceNames="Users,Orders,Products" # Deploy with the same values sam deploy --language-extensions --parameter-overrides ServiceNames="Users,Orders,Products"

ネストされたスタック

Fn::ForEach ネストされたスタックテンプレート (AWS::CloudFormation::Stack) の がサポートされています。は親スタックの AWS SAM CLIParametersプロパティを子テンプレート拡張に渡すため、親が指定したパラメータを参照する子Fn::ForEachコレクションは正しく解決されます。

# parent.yaml Resources: ChildStack: Type: AWS::CloudFormation::Stack Properties: TemplateURL: ./child.yaml Parameters: ServiceNames: "Users,Orders,Products"

ネストされた Fn::ForEach

最大 5 レベルのネストがサポートされ、 CloudFormation 制限に一致:

Resources: Fn::ForEach::Envs: - Env - [Dev, Staging, Prod] - Fn::ForEach::Services: - Svc - [Users, Orders] - ${Env}${Svc}Function: Type: AWS::Serverless::Function Properties: CodeUri: ./services/${Svc} Environment: Variables: STAGE: ${Env}

出力の ForEach

Fn::ForEach ブロックも Outputsセクション内で展開されるため、コレクション値ごとに 1 つの出力を出力できます。

Outputs: Fn::ForEach::FunctionArns: - Name - [alpha, beta] - ${Name}FunctionArn: Value: !GetAtt - !Sub "${Name}Function" - Arn

条件と DependsOn

によって出力されるリソースFn::ForEachは、他のリソースDependsOnと同様に Conditionおよび を実行できます。条件または依存関係は、生成された各リソースにレプリケートされます。

Conditions: IsProd: !Equals [!Ref Environment, prod] Resources: SharedTable: Type: AWS::DynamoDB::Table # ... Fn::ForEach::Functions: - Name - [api, worker] - ${Name}Function: Type: AWS::Serverless::Function Condition: IsProd DependsOn: SharedTable Properties: Handler: main.handler CodeUri: functions/${Name}/

&{identifier} 構文

この&{identifier}構文は、置換された値から英数字以外の文字を削除します。これは、IP アドレスなどの値から有効な論理 IDs を生成するのに役立ちます。

Fn::ForEach::Hosts: - IP - ["10.0.0.1", "10.0.0.2"] - Host&{IP}: Type: AWS::EC2::Instance # Expands to Host10001, Host10002

サポートされている組み込み関数

以下の組み込み関数は、拡張中にローカルで解決されます。

言語拡張機能の拡張中にローカルで解決された組み込み関数
関数 説明

Fn::ForEach

ループ拡張。

Fn::Length

リスト要素の数を返します。

Fn::ToJsonString

値をJSON文字列に変換します。

Fn::FindInMap

オプションの を含むマップルックアップDefaultValue

Fn::If

条件付き値の選択。

Fn::Sub

文字列の置換。

Fn::Join

文字列連結。

Fn::Split

文字列の分割。

Fn::Select

要素の選択を一覧表示します。

Fn::Base64

Base64 エンコーディング。

Fn::Equals, Fn::And, Fn::Or, Fn::Not

条件評価。

Ref

パラメータと擬似パラメータの参照。

デプロイされたリソース (Fn::GetAttFn::ImportValueFn::GetAZs) を必要とする関数は、デプロイ時に が解決 CloudFormation できるように保持されます。

検証エラー

AWS SAM 変換を実行する前に、次のテンプレートの問題がローカルで検出されます。

言語拡張機能の拡張中に発生した検証エラー
原因 エラーメッセージ

Fn::ForEach 値が形式が正しくありません。リストではない、要素が 3 つしかない、または文字列以外のループ識別子があります。

Fn::ForEach::<key> layout is incorrect ( として引き上げ)InvalidTemplateException

5 レベル以上の Fn::ForEachがネストされています。

Fn::ForEach nesting depth of <N> exceeds the maximum allowed depth of 5. CloudFormation supports up to 5 nested Fn::ForEach loops.

コレクションは空のリスト ( を含むCommaDelimitedListパラメータなどDefault: "") に解決されます。

エラーなし — ループはサイレントにスキップされ、リソースは出力されません。

コレクション!Ref内の は、テンプレートで宣言されていないパラメータを指します。

エラーなし — 未解決のリファレンスはテンプレートに保持されます。デプロイ時に、 CloudFormation はサーバー側で解決します。

制限事項

  • コレクションはビルド/パッケージ時に解決可能である必要があります。Fn::GetAttFn::ImportValue、または SSM/Secrets Manager の動的参照を使用するFn::ForEachコレクションをローカルで展開することはできません。--parameter-overrides 代わりに で パラメータを使用します。

  • 動的アーティファクトマッピングはパッケージ時に固定されます。Fn::ForEach コレクションがパラメータリファレンスであり、ループ本文が動的アーティファクトプロパティ ( などCodeUri: ./services/${Name}) を使用する場合、生成されたSAM*マッピングには、パッケージ時に解決されたパラメータ値のエントリのみが含まれます。再パッケージ化せずにデプロイ時にそのパラメータ--parameter-overridesを変更した場合、新しい値には Mapping エントリがなく、デプロイは失敗します。これは、動的アーティファクトの駆動に使用されていないパラメータには適用されませんFn::ForEach

  • DeletionPolicyUpdateReplacePolicy は、拡張中に検証および解決されます。これらは パラメータをサポートしていますがRef、他の組み込み関数はサポートしていません。

  • ネスト制限。 CloudFormation サーバー側の制限に合わせて、最大 5 レベルの をネストFn::ForEachできます。

  • 予約済みマッピング名。次のいずれかで始まるマッピング名は AWS SAM CLI用に予約されています。これらのプレフィックスを使用して独自のマッピングを作成しないでください。

    • SAMCodeUriSAMImageUriSAMContentUriSAMDefinitionUri、、SAMSchemaUriSAMCode、、 SAMContent — 動的アーティファクトプロパティsam package用に SAMBodyS3Location SAMDefinitionS3Location SAMTemplateURLによって出力されます。動的アーティファクトプロパティ 表を参照してください。

    • SAMLayersFn::ForEachが生成した関数が自動生成された依存関係レイヤー参照 ( が AWS SAM CLIネストされたスタックに構築する Lambda レイヤー) を取得するsam buildと、 によって出力されます。このプレフィックスには、対応するユーザー作成プロパティはなく、自動的に追加されます。

テレメトリ

は、 --language-extensions (または同等の環境変数) AWS SAM CLIでコマンドが呼び出され、テンプレートがAWS::LanguageExtensions変換を宣言すると、CFNLanguageExtensionsテレメトリイベントを発行します。イベントは呼び出しごとに 1 回発生し、テンプレートコンテンツは送信されません。ローカル処理がオフ (デフォルト) の場合、イベントは発生しません。