@alchemy.run/aws (英语)
AWS 用于 炼金术. 宣告Lambda函数,S3,SQS,DynamomDB,ECS,EKS,以及另外200个服务在与使用它们的代码相同的TypeScript程序中. 装订商会给你写最不优惠的IAM政策.
npm install alchemy @alchemy.run/aws effect
一个Lambda函数将两个S3操作捆绑在一个桶上:
// src/api.ts
import * as AWS from "@alchemy.run/aws";
import * as Effect from "effect/Effect";
import { HttpServerRequest } from "effect/http/HttpServerRequest";
import * as HttpServerResponse from "effect/http/HttpServerResponse";
import * as Layer from "effect/Layer";
export default class Api extends AWS.Lambda.Function<Api>()(
"Api",
{ main: import.meta.url, functionUrl: true },
Effect.gen(function* () {
const bucket = yield* AWS.S3.Bucket("Bucket");
// Each binding adds exactly one IAM permission to the function's role.
const putObject = yield* AWS.S3.PutObject(bucket);
const getObject = yield* AWS.S3.GetObject(bucket);
return {
fetch: Effect.gen(function* () {
const request = yield* HttpServerRequest;
const key = request.url.split("/").pop()!;
if (request.method === "PUT") {
yield* putObject({ Key: key, Body: yield* request.text });
return HttpServerResponse.empty({ status: 201 });
}
const object = yield* getObject({ Key: key }).pipe(
Effect.catchTag("NoSuchKey", () => Effect.succeed(undefined)),
);
if (!object?.Body) {
return HttpServerResponse.text("Not found", { status: 404 });
}
return HttpServerResponse.stream(object.Body);
}).pipe(Effect.orDie),
};
}).pipe(Effect.provide(Layer.mergeAll(AWS.S3.PutObjectHttp, AWS.S3.GetObjectHttp))),
) {}
堆栈部署它:
// alchemy.run.ts
import * as Alchemy from "alchemy";
import * as AWS from "@alchemy.run/aws";
import * as Effect from "effect/Effect";
import Api from "./src/api.ts";
export default Alchemy.Stack(
"MyApp",
{
providers: AWS.providers(),
state: AWS.state(),
},
Effect.gen(function* () {
const api = yield* Api;
return { url: api.functionUrl };
}),
);
alchemy deploy 创建桶、功能、作用和允许 s3:PutObject 财务报告和审定财务报表 s3:GetObject 只有那个桶.