기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
CloudFormation 언어 확장 지원
는 AWS SAM CLI , Fn::ForEach, Fn::Length및 Fn::ToJsonStringFn::FindInMap를 포함하여 AWS::LanguageExtensions 변환을 사용하는 템플릿을 지원합니다DefaultValue. 이러한 구문에 대한 전체 참조 정보는 AWS CloudFormation 사용 설명서의 AWS::LanguageExtensions 변환을 참조하세요.
AWS SAM 템플릿에서 언어 확장을 사용하려면 앞AWS::LanguageExtensions의 Transform 섹션에를 나열합니다AWS::Serverless-2016-10-31.
Transform: - AWS::LanguageExtensions - AWS::Serverless-2016-10-31
가 템플릿의 Transform 섹션에서 AWS::LanguageExtensions를 감지하고 로컬 처리에 옵트인한 경우 AWS SAM CLI AWS SAM 변환을 실행하기 전에 언어 확장 구성을 로컬로 확장합니다. 이렇게 하면 sam build, sam package, sam deploy, sam sync, sam validate, sam local start-api, sam local invoke및가 이러한 구문을 사용하는 템플릿으로 작업sam local start-lambda할 수 있습니다.
로컬 처리는 기본적으로 꺼져 있습니다. 끄면는 AWS SAM CLI 템플릿을 변경 없이 전달하고 배포 시 AWS::LanguageExtensions 변환 서버 측을 CloudFormation 처리합니다. 활성화 방법은 섹션을 참조하세요언어 확장 활성화.
확장은 활성화되면 두 단계로 이루어집니다.
-
1단계(언어 확장) -
Fn::ForEach루프가 확장되고 가능한 경우 내장 함수가 확인되며 템플릿이 표준으로 변환됩니다 CloudFormation. -
2단계(AWS SAM 변환) - 확장된 템플릿은 AWS SAM 변환기에서 평소와 같이 처리됩니다.
는 AWS::LanguageExtensions 변환 서버 측을 CloudFormation 처리하기 때문에 원래 템플릿(Fn::ForEach온전한 템플릿 포함)은 CloudFormation 배포용으로 보존됩니다.
언어 확장 활성화
의 로컬 처리AWS::LanguageExtensions는 명령당 옵트인됩니다. 우선순위에 따라 나열된 세 가지 활성화 방법이 있습니다.
-
CLI 플래그 - 단일 간접 호출
--language-extensions을 전달합니다.sam build --language-extensions sam package --language-extensions ... sam deploy --language-extensions ...--no-language-extensions는 명시적으로 비활성화하여 아래 설명된samconfig.toml및 환경 변수를 모두 재정의합니다. -
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 = truesamconfig.toml항목은 명령의 기본값으로 로드되므로 플래그가 전달된 것처럼 적용되므로 환경 변수를 통과합니다. -
환경 변수 - 현재 쉘에 대해를 활성화
SAM_CLI_ENABLE_LANGUAGE_EXTENSIONS=1하도록 설정합니다.export SAM_CLI_ENABLE_LANGUAGE_EXTENSIONS=1 sam build sam local invoke MyFunction신뢰할 수 있는 값(대/소문자 비구분)은
1, 및true입니다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}
를 실행하면 UsersFunction, OrdersFunction및 로 sam build 확장되며ProductsFunction, 각 소스 디렉터리에서 빌드됩니다.
동적 아티팩트 속성
패키지 가능한 속성이 루프 변수(예: ./services/${Name})를 사용하는 경우는 CloudFormation Mappings 각 컬렉션 값을 Amazon S3에 매핑하는 섹션을 AWS SAM CLI 생성합니다URI. Fn::ForEach 본문은 사용하도록 다시 작성Fn::FindInMap되므로는 배포 시 올바른 아티팩트를 확인할 CloudFormation 수 있습니다.
인식된 아티팩트 속성은 현재 sam package 다시 쓰는 속성과 동일합니다. 여기에는 다음이 포함됩니다.
| 리소스 유형 | 속성 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
점 속성(예: Command.ScriptLocation AWS::Glue::Job 또는 Code.ImageUri AWS::Lambda::Function)의 경우 리소스의 중첩된 위치에서 값을 읽고 씁니다. 생성된 매핑 이름은 속성 경로의 리프 세그먼트만 사용합니다.
속성이 루프 템플릿화되면 매핑 이름은 입니다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 본문당 여러 리소스
단일 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 본문의 두 리소스가 동일한 동적 아티팩트 속성을 선언하면(예: Api 및 StateMachine 모두 사용DefinitionUri) AWS SAM CLI는 리소스 logical-ID 템플릿의 정적 부분에서 가져온 접미사를 추가하여 매핑 이름을 고유하게 유지합니다.
| 리소스 템플릿 | 속성 | 매핑 이름 |
|---|---|---|
|
|
|
|
|
|
충돌이 없는 경우 기본 이름(예: SAMDefinitionUriServices)이 사용됩니다.
파라미터 기반 컬렉션
Fn::ForEach 컬렉션이 파라미터 참조(예: !Ref ServiceNames)이고 루프 본문이 동적 아티팩트 속성(예: CodeUri: ./services/${Name})을 사용하는 경우는 AWS SAM CLI에 설명된 SAM* 매핑을 생성하기 위해 컬렉션 값이 필요합니다동적 아티팩트 속성. 다음에서 템플릿을 처리할 때 이를 해결합니다.
-
--parameter-overrides가 AWS SAM CLI 명령에 전달되었습니다. -
템플릿의 파라미터
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 CLI 상위 스택의 Parameters 속성을 하위 템플릿 확장에 전달하므로 상위 제공 파라미터를 참조하는 하위 Fn::ForEach 컬렉션은 올바르게 해석됩니다.
# parent.yaml Resources: ChildStack: Type: AWS::CloudFormation::Stack Properties: TemplateURL: ./child.yaml Parameters: ServiceNames: "Users,Orders,Products"
중첩된 Fn::ForEach
CloudFormation 한도와 일치하는 최대 5개의 중첩 수준이 지원됩니다.
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 in Outputs
Fn::ForEach 블록도 Outputs 섹션 내에서 확장되므로 컬렉션 값당 하나의 출력을 내보낼 수 있습니다.
Outputs: Fn::ForEach::FunctionArns: - Name - [alpha, beta] - ${Name}FunctionArn: Value: !GetAtt - !Sub "${Name}Function" - Arn
조건 및 DependsOn
에서 내보내는 리소스는 다른 리소스와 DependsOn 마찬가지로 Condition 및를 전달할 Fn::ForEach 수 있습니다. 조건 또는 종속성은 생성된 각 리소스에 복제됩니다.
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
지원되는 내장 함수
다음 내장 함수는 확장 중에 로컬에서 확인됩니다.
| 함수 | 설명 |
|---|---|
|
루프 확장. |
|
목록 요소의 수를 반환합니다. |
|
값을 JSON 문자열로 변환합니다. |
|
선택적를 포함한 맵 조회 |
|
조건부 값 선택. |
|
문자열 대체. |
|
문자열 연결. |
|
문자열 분할. |
|
요소 선택을 나열합니다. |
|
Base64 인코딩. |
|
조건 평가. |
|
파라미터 및 의사 파라미터 참조입니다. |
배포된 리소스(Fn::GetAtt, Fn::ImportValue, Fn::GetAZs)가 필요한 함수는 CloudFormation 에 대해 보존되어 배포 시 해결됩니다.
유효성 검사 오류
AWS SAM 변환이 실행되기 전에 다음 템플릿 문제가 로컬에서 발견됩니다.
| 원인 | 오류 메시지 |
|---|---|
|
|
5개 이상의 수준이 |
|
컬렉션이 빈 목록(예:가 있는 |
오류 없음 - 루프를 자동으로 건너뛰고 리소스를 내보내지 않습니다. |
모음의는 템플릿 |
오류 없음 - 해결되지 않은 참조는 템플릿에 보존됩니다. 배포 시 CloudFormation 는 서버 측에서 문제를 해결합니다. |
제한 사항
-
컬렉션은 빌드/패키지 시간에 확인 가능해야 합니다.
Fn::GetAtt,Fn::ImportValue또는 SSM/Secrets Manager 동적 참조를 사용하는Fn::ForEach컬렉션은 로컬로 확장할 수 없습니다.--parameter-overrides대신와 함께 파라미터를 사용합니다. -
동적 아티팩트 매핑은 패키지 시간에 고정됩니다.
Fn::ForEach컬렉션이 파라미터 참조이고 루프 본문이 동적 아티팩트 속성(예:CodeUri: ./services/${Name})을 사용하는 경우 생성된SAM*매핑에는 패키지 시간에 확인된 파라미터 값에 대한 항목만 포함됩니다. 다시 패키징하지 않고 배포 시 해당 파라미터에--parameter-overrides대해를 변경하면 새 값에 매핑 항목이 없으며 배포가 실패합니다. 동적 아티팩트를 구동하는 데 사용되지 않는 파라미터에는 적용되지 않습니다Fn::ForEach. -
DeletionPolicy및UpdateReplacePolicy는 확장 중에 검증되고 해결됩니다. 파라미터Ref는 지원하지만 다른 내장 함수는 지원하지 않습니다. -
중첩 제한. CloudFormation 서버 측 제한과 일치하는 최대 5개의 수준이 중첩될
Fn::ForEach수 있습니다. -
예약 매핑 이름입니다. 다음 중 하나로 시작하는 매핑 이름은 용으로 예약되어 있습니다. AWS SAM CLI 이러한 접두사를 사용하여 자체 매핑을 작성하지 마십시오.
-
SAMCodeUri,SAMImageUri,SAMContentUri,SAMDefinitionUri,SAMSchemaUri,SAMDefinitionS3Location,SAMBodyS3LocationSAMTemplateURL, ,SAMCode, , ,SAMContent- 동적 아티팩트 속성에sam package대해에서 내보냅니다. 동적 아티팩트 속성 표를 참조하십시오. -
SAMLayersFn::ForEach- 생성 함수가 자동 생성된 종속성 계층 참조를 선택할sam build때에서 내보냅니다(Lambda는 빌드를 AWS SAM CLI 중첩 스택으로 계층화). 이 접두사에는 해당하는 사용자 작성 속성이 없으며 자동으로 추가됩니다.
-
원격 측정
이 AWS SAM CLI CFNLanguageExtensions 원격 측정 이벤트는 명령이 --language-extensions (또는 이에 상응하는 환경 변형)으로 호출되고 템플릿이 AWS::LanguageExtensions 변환을 선언할 때 발생합니다. 이벤트는 호출당 한 번 실행되며 템플릿 콘텐츠는 전송되지 않습니다. 로컬 처리가 꺼져 있으면(기본값) 이벤트가 실행되지 않습니다.