Linking
리소스를 연결하고 타입 안전하고 안전한 방식으로 접근할 수 있습니다.
링크
리소스 링크를 사용하면 런타임 코드에서 인프라를 타입 안전하고 안전하게 접근할 수 있습니다.
-
링크할 리소스를 생성합니다. 예를 들어, 버킷을 만듭니다.
sst.config.ts const bucket = new sst.aws.Bucket("MyBucket"); -
link속성을 사용하여 함수나 프론트엔드에 연결합니다.sst.config.ts new sst.aws.Nextjs("MyWeb", {link: [bucket]});sst.config.ts new sst.aws.Remix("MyWeb", {link: [bucket]});sst.config.ts new sst.aws.Astro("MyWeb", {link: [bucket]});sst.config.ts new sst.aws.Function("MyFunction", {handler: "src/lambda.handler",link: [bucket]}); -
SDK를 사용하여 런타임에서 링크된 리소스에 타입 안전하게 접근합니다.
app/page.tsx import { Resource } from "sst";console.log(Resource.MyBucket.name);app/routes/_index.tsx import { Resource } from "sst";console.log(Resource.MyBucket.name);src/pages/index.astro ---import { Resource } from "sst";console.log(Resource.MyBucket.name);---src/lambda.ts import { Resource } from "sst";console.log(Resource.MyBucket.name);
로컬에서 작업하기
위 내용은 sst deploy를 통해 배포된 앱에 적용됩니다.
로컬에서 연결된 리소스에 접근하려면 sst dev를 실행해야 합니다. 기본적으로 sst dev CLI는 멀티플렉서를 실행하며 프론트엔드도 함께 시작합니다. 이렇게 하면 환경에 모든 연결된 리소스가 로드됩니다. sst dev에 대해 더 알아보세요.
하지만 멀티플렉서를 사용하지 않는 경우:
sst dev --mode=basic프론트엔드의 개발 명령어를 sst dev 명령어로 감싸야 합니다.
sst dev next devsst dev remix devsst dev astro devsst dev동작 원리
리소스를 함수나 프론트엔드에 연결하면 다음과 같은 과정이 진행됩니다:
-
리소스가 노출하는 _링크_가 함수 패키지에 주입됩니다.
-
이 링크에 접근하기 위한 타입이 생성됩니다.
-
함수는 연결된 리소스에 접근할 수 있는 권한을 부여받습니다.
링크 주입
여러분이 sst dev나 sst deploy를 실행할 때, 리소스 링크가 함수나 프론트엔드 패키지에 주입됩니다. 하지만 이 두 경우에는 약간 다른 방식으로 주입이 이루어집니다.
함수
SST의 함수는 esbuild를 사용해 트리 셰이킹되고 번들링됩니다. 번들링 과정에서 SST는 리소스 링크를 globalThis에 주입합니다.
프론트엔드
SST는 프론트엔드를 번들링하지 않습니다. 대신, 프론트엔드가 빌드될 때 SST는 SST_RESOURCE_ 접두사를 사용하여 리소스 링크를 process.env 객체에 주입합니다.
이것이 여러분이 프론트엔드를 로컬에서 실행할 때 sst dev 커맨드로 감싸야 하는 이유입니다.
타입 생성하기
sst dev 또는 sst deploy를 실행하면 연결된 리소스에 접근할 수 있는 타입이 생성됩니다. 이 타입들은 다음과 같이 생성됩니다:
- 함수나 프론트엔드가 링크를 받는 가장 가까운
package.json파일과 같은 디렉토리에sst-env.d.ts파일이 생성됩니다. 이 파일에는 해당 리소스에 연결된 타입들이 포함됩니다. sst-env.d.ts에서 참조할 수 있는.sst/types.generated.ts파일이 생성됩니다. 이 파일은 함수나 프론트엔드가 없는 모노레포 패키지에 유용합니다. 예를 들어, 공유 코드를 포함하는 core 패키지가 있는 경우에 사용할 수 있습니다.
생성된 sst-env.d.ts 타입 파일을 소스 컨트롤에 체크인할 수 있습니다. 이렇게 하면 팀원들이 변경 사항을 가져올 때 sst dev를 실행하지 않고도 타입을 확인할 수 있습니다.
링크 확장하기
위 예제들은 SST 컴포넌트에 내장되어 있습니다. 여러분은 이러한 링크의 일부로 부여되는 권한을 수정하고 싶을 수 있습니다.
또는 Pulumi/Terraform 생태계의 다른 리소스를 연결하거나, SST가 노출하는 출력과 다른 세트를 연결하고 싶을 수도 있습니다.
이러한 작업은 sst.Linkable 컴포넌트를 사용하여 수행할 수 있습니다.
값 연결하기
Linkable 컴포넌트는 여러분이 연결하려는 속성 목록을 받습니다. 이 속성들은 다른 리소스의 출력값이나 상수일 수 있습니다.
const myLinkable = new sst.Linkable("MyLinkable", { properties: { foo: "bar" }});필요에 따라 연결된 리소스에 대한 권한이나 바인딩을 포함할 수도 있습니다.
이제 이 리소스를 프론트엔드나 함수에 연결할 수 있습니다.
new sst.aws.Function("MyApi", { handler: "src/lambda.handler", link: [myLinkable]});런타임에 이 값을 사용하려면 SDK를 사용하세요.
import { Resource } from "sst";
console.log(Resource.MyLinkable.foo);sst.Linkable에 대해 더 알아보세요.
리소스 연결하기
Linkable.wrap 정적 메서드를 사용하면 어떤 리소스 클래스든 감싸서 연결 가능하게 만들 수 있습니다.
Linkable.wrap(aws.dynamodb.Table, (table) => ({ properties: { tableName: table.name }}));이제 aws.dynamodb.Table의 인스턴스를 생성하고 다른 SST 컴포넌트처럼 앱에서 연결할 수 있습니다.
const table = new aws.dynamodb.Table("MyTable", { attributes: [{ name: "id", type: "S" }], hashKey: "id"});
new sst.aws.Nextjs("MyWeb", { link: [table]});런타임에 SDK를 사용하여 접근할 수 있습니다.
import { Resource } from "sst";
console.log(Resource.MyTable.tableName);내장 링크 수정하기
SST가 생성하는 링크를 수정할 수도 있습니다. 예를 들어, 링크 가능한 리소스의 권한을 변경하고 싶을 수 있습니다.
sst.Linkable.wrap(sst.aws.Bucket, (bucket) => ({ properties: { name: bucket.name }, include: [ sst.aws.permission({ actions: ["s3:GetObject"], resources: [bucket.arn] }) ] }));이 코드는 기존 링크를 재정의하고 여러분만의 링크를 생성할 수 있게 해줍니다.
sst.Linkable.wrap에 대해 더 알아보세요.