토큰 및 AWS CDK - AWS Cloud Development Kit (AWS CDK) v2

AWS CDK v2 개발자 안내서입니다. 구형 CDK v1은 2022년 6월 1일에 유지 보수에 들어갔고 2023년 6월 1일에 지원이 종료되었습니다.

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

토큰 및 AWS CDK

토큰은 앱 수명 주기의 후반에만 확인할 수 있는 값을 나타냅니다. 예를 들어 CDK 앱에서 정의하는 Amazon Simple Storage Service (Amazon S3) 버킷의 이름은 템플릿이 합성될 때만 AWS CloudFormation 할당됩니다. 문자열인 bucket.bucketName 속성을 인쇄하면 다음과 같은 내용이 포함된 것을 볼 수 있습니다.

${TOKEN[Bucket.Name.1234]}

생성 당시에는 값이 아직 알려지지 않았지만 나중에 사용할 수 있게 될 토큰을 이 AWS CDK 인코딩하는 방식입니다. 이들은 이를 플레이스홀더 AWS CDK 토큰이라고 부릅니다. 이 경우에는 문자열로 인코딩된 토큰입니다.

이 문자열을 마치 버킷 이름인 것처럼 전달할 수 있습니다. 다음 예시에서는 버킷 이름을 AWS Lambda 함수에 대한 환경 변수로 지정합니다.

TypeScript
const bucket = new s3.Bucket(this, 'MyBucket'); const fn = new lambda.Function(stack, 'MyLambda', { // ... environment: { BUCKET_NAME: bucket.bucketName, } });
JavaScript
const bucket = new s3.Bucket(this, 'MyBucket'); const fn = new lambda.Function(stack, 'MyLambda', { // ... environment: { BUCKET_NAME: bucket.bucketName } });
Python
bucket = s3.Bucket(self, "MyBucket") fn = lambda_.Function(stack, "MyLambda", environment=dict(BUCKET_NAME=bucket.bucket_name))
Java
final Bucket bucket = new Bucket(this, "MyBucket"); Function fn = Function.Builder.create(this, "MyLambda") .environment(java.util.Map.of( // Map.of requires Java 9+ "BUCKET_NAME", bucket.getBucketName())) .build();
C#
var bucket = new s3.Bucket(this, "MyBucket"); var fn = new Function(this, "MyLambda", new FunctionProps { Environment = new Dictionary<string, string> { ["BUCKET_NAME"] = bucket.BucketName } });

AWS CloudFormation 템플릿이 최종적으로 합성되면 토큰은 AWS CloudFormation 내장 { "Ref": "MyBucket" } 토큰으로 렌더링됩니다. 배포 시 이 내장 함수를 생성된 버킷의 실제 이름으로 AWS CloudFormation 대체합니다.

토큰 및 토큰 인코딩

토큰은 단일 resolve 메서드를 포함하는 IResolvable인터페이스를 구현하는 객체입니다. 는 합성 중에 이 메서드를 AWS CDK 호출하여 AWS CloudFormation 템플릿의 최종 값을 생성합니다. 토큰은 합성 프로세스에 참여하여 모든 유형의 임의 값을 생성합니다.

참고

IResolvable인터페이스로 직접 작업하는 경우는 거의 없습니다. 문자열로 인코딩된 버전의 토큰만 표시될 가능성이 높습니다.

다른 함수는 일반적으로 또는 같은 기본 유형의 인수만 받아들입니다. string number 이러한 경우 토큰을 사용하려면 CDK.Token 클래스의 정적 메서드를 사용하여 토큰을 세 가지 유형 중 하나로 인코딩할 수 있습니다.

이는 a일 수 있는 임의의 값을 취하여 지정된 유형의 프리미티브 값으로 인코딩합니다. IResolvable

중요

이전 유형 중 하나라도 인코딩된 토큰일 수 있으므로 내용을 파싱하거나 읽을 때는 주의해야 합니다. 예를 들어 문자열을 구문 분석하여 값을 추출하려고 하는데 해당 문자열이 인코딩된 토큰인 경우 구문 분석이 실패합니다. 마찬가지로 배열의 길이를 쿼리하거나 숫자를 사용하여 수학 연산을 수행하려는 경우 먼저 해당 배열이 인코딩된 토큰이 아닌지 확인해야 합니다.

값에 확인되지 않은 토큰이 있는지 확인하려면 Token.isUnresolved (Python:is_unresolved) 메서드를 호출합니다.

다음 예제는 토큰일 수 있는 문자열 값이 10자를 넘지 않는지 확인합니다.

TypeScript
if (!Token.isUnresolved(name) && name.length > 10) { throw new Error(`Maximum length for name is 10 characters`); }
JavaScript
if ( !Token.isUnresolved(name) && name.length > 10) { throw ( new Error(`Maximum length for name is 10 characters`)); }
Python
if not Token.is_unresolved(name) and len(name) > 10: raise ValueError("Maximum length for name is 10 characters")
Java
if (!Token.isUnresolved(name) && name.length() > 10) throw new IllegalArgumentException("Maximum length for name is 10 characters");
C#
if (!Token.IsUnresolved(name) && name.Length > 10) throw new ArgumentException("Maximum length for name is 10 characters");

이름이 토큰인 경우 검증이 수행되지 않으며 수명 주기의 나중 단계 (예: 배포 중) 에서 여전히 오류가 발생할 수 있습니다.

참고

토큰 인코딩을 사용하여 형식 시스템을 이스케이프할 수 있습니다. 예를 들어 합성 시 숫자 값을 생성하는 토큰을 문자열 인코딩할 수 있습니다. 이러한 함수를 사용하는 경우 합성 후 템플릿이 사용 가능한 상태로 변환되는지 확인하는 것은 사용자의 책임입니다.

문자열로 인코딩된 토큰

문자열로 인코딩된 토큰은 다음과 같습니다.

${TOKEN[Bucket.Name.1234]}

다음 예제와 같이 일반 문자열처럼 전달되고 연결될 수 있습니다.

TypeScript
const functionName = bucket.bucketName + 'Function';
JavaScript
const functionName = bucket.bucketName + 'Function';
Python
function_name = bucket.bucket_name + "Function"
Java
String functionName = bucket.getBucketName().concat("Function");
C#
string functionName = bucket.BucketName + "Function";

다음 예제와 같이 해당 언어에서 문자열 보간을 지원하는 경우 문자열 보간을 사용할 수도 있습니다.

TypeScript
const functionName = `${bucket.bucketName}Function`;
JavaScript
const functionName = `${bucket.bucketName}Function`;
Python
function_name = f"{bucket.bucket_name}Function"
Java
String functionName = String.format("%sFunction". bucket.getBucketName());
C#
string functionName = $"${bucket.bucketName}Function";

다른 방법으로 문자열을 조작하지 마세요. 예를 들어 문자열의 하위 문자열을 가져오면 문자열 토큰이 손상될 수 있습니다.

목록으로 인코딩된 토큰

목록으로 인코딩된 토큰은 다음과 같습니다.

["#{TOKEN[Stack.NotificationArns.1234]}"]

이러한 목록을 사용하여 수행할 수 있는 유일한 안전한 방법은 다른 구조에 직접 전달하는 것입니다. 문자열 목록 형식의 토큰은 연결할 수 없으며 토큰에서 요소를 가져올 수도 없습니다. 안전하게 조작할 수 있는 유일한 방법은 fn.select와 같은 AWS CloudFormation 내장 함수를 사용하는 것입니다.

숫자로 인코딩된 토큰

숫자로 인코딩된 토큰은 다음과 같은 작은 음수 부동 소수점 숫자 집합입니다.

-1.8881545897087626e+289

리스트 토큰과 마찬가지로 숫자 값을 수정할 수 없습니다. 이렇게 하면 숫자 토큰이 손상될 수 있기 때문입니다. 허용되는 유일한 작업은 값을 다른 구문으로 전달하는 것입니다.

지연 값

토큰은 AWS CloudFormation 매개변수와 같은 배포 시간 값을 나타내는 것 외에도 합성 시간의 지연 값을 나타내는 데에도 일반적으로 사용됩니다. 이러한 값은 합성이 완료되기 전에 최종 값이 결정되지만 값이 구성되는 시점에서는 결정되지 않습니다. 토큰을 사용하여 리터럴 문자열이나 숫자 값을 다른 구문에 전달하는 반면, 합성 시점의 실제 값은 아직 발생하지 않은 일부 계산에 따라 달라질 수 있습니다.

Lazy클래스의 정적 메서드 (예: Lazy.String 및 Lazy.Number) 를 사용하여 신시사이저 타임의 지연 값을 나타내는 토큰을 생성할 수 있습니다. 이러한 메서드는 컨텍스트 인수를 받아들이고 호출 시 최종 값을 반환하는 함수가 produce 속성인 객체를 받아들입니다.

다음 예에서는 생성 후 용량이 결정되는 Auto Scaling 그룹을 생성합니다.

TypeScript
let actualValue: number; new AutoScalingGroup(this, 'Group', { desiredCapacity: Lazy.numberValue({ produce(context) { return actualValue; } }) }); // At some later point actualValue = 10;
JavaScript
let actualValue; new AutoScalingGroup(this, 'Group', { desiredCapacity: Lazy.numberValue({ produce(context) { return (actualValue); } }) }); // At some later point actualValue = 10;
Python
class Producer: def __init__(self, func): self.produce = func actual_value = None AutoScalingGroup(self, "Group", desired_capacity=Lazy.number_value(Producer(lambda context: actual_value)) ) # At some later point actual_value = 10
Java
double actualValue = 0; class ProduceActualValue implements INumberProducer { @Override public Number produce(IResolveContext context) { return actualValue; } } AutoScalingGroup.Builder.create(this, "Group") .desiredCapacity(Lazy.numberValue(new ProduceActualValue())).build(); // At some later point actualValue = 10;
C#
public class NumberProducer : INumberProducer { Func<Double> function; public NumberProducer(Func<Double> function) { this.function = function; } public Double Produce(IResolveContext context) { return function(); } } double actualValue = 0; new AutoScalingGroup(this, "Group", new AutoScalingGroupProps { DesiredCapacity = Lazy.NumberValue(new NumberProducer(() => actualValue)) }); // At some later point actualValue = 10;

다음으로 변환 JSON

임의의 데이터로 구성된 JSON 문자열을 생성하려고 하는데 데이터에 토큰이 포함되어 있는지 여부를 모를 수 있습니다. 토큰이 포함되어 있는지 여부와 상관없이 데이터 구조를 적절하게 JSON 인코딩하려면 메서드 스택을 사용하십시오. toJsonString, 다음 예제와 같습니다.

TypeScript
const stack = Stack.of(this); const str = stack.toJsonString({ value: bucket.bucketName });
JavaScript
const stack = Stack.of(this); const str = stack.toJsonString({ value: bucket.bucketName });
Python
stack = Stack.of(self) string = stack.to_json_string(dict(value=bucket.bucket_name))
Java
Stack stack = Stack.of(this); String stringVal = stack.toJsonString(java.util.Map.of( // Map.of requires Java 9+ put("value", bucket.getBucketName())));
C#
var stack = Stack.Of(this); var stringVal = stack.ToJsonString(new Dictionary<string, string> { ["value"] = bucket.BucketName });