v AWS CDK 2 개발자 안내서입니다. 이전 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, 'amzn-s3-demo-bucket');
const fn = new lambda.Function(stack, 'MyLambda', {
// ...
environment: {
BUCKET_NAME: bucket.bucketName,
}
});
- JavaScript
-
const bucket = new s3.Bucket(this, 'amzn-s3-demo-bucket');
const fn = new lambda.Function(stack, 'MyLambda', {
// ...
environment: {
BUCKET_NAME: bucket.bucketName
}
});
- Python
-
bucket = s3.Bucket(self, "amzn-s3-demo-bucket")
fn = lambda_.Function(stack, "MyLambda",
environment=dict(BUCKET_NAME=bucket.bucket_name))
- Java
-
final Bucket bucket = new Bucket(this, "amzn-s3-demo-bucket");
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, "amzn-s3-demo-bucket");
var fn = new Function(this, "MyLambda", new FunctionProps {
Environment = new Dictionary<string, string>
{
["BUCKET_NAME"] = bucket.BucketName
}
});
AWS CloudFormation 템플릿이 최종적으로 합성되면 토큰이 AWS CloudFormation 내장 로 렌더링됩니다{ "Ref": "amzn-s3-demo-bucket" }
. 배포 시 는 이 내장을 생성된 버킷의 실제 이름으로 바 AWS CloudFormation 꿉니다.
토큰 및 토큰 인코딩
토큰은 IResolvable 인터페이스를 구현하는 객체로, 단일 resolve
메서드를 포함합니다. 는 합성 중에 이 메서드를 AWS CDK AWS CloudFormation 호출하여 템플릿의 최종 값을 생성합니다. 토큰은 합성 프로세스에 참여하여 모든 유형의 임의 값을 생성합니다.
IResolvable
인터페이스로 직접 작업하는 경우는 거의 없습니다. 문자열로 인코딩된 버전의 토큰만 표시될 가능성이 높습니다.
다른 함수는 일반적으로 string
또는 와 같은 기본 유형의 인수만 허용합니다number
. 이러한 경우 토큰을 사용하려면 cdk.Token 클래스에서 정적 메서드를 사용하여 토큰을 세 가지 유형 중 하나로 인코딩할 수 있습니다.
이들은 임의의 값을 가져와 가 될 수 있으며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
});