这里列出了IaC项目结构:
./
├── cdk.context.json
├── package.json
├── package-lock.json
├── README.md
├── sst.json
└── stacks
├── common
│ ├── Msk.js
│ └── Vpc.js
├── index.js
├── posiciones
│ ├── Consumer.js
│ └── DocumentDB.js
└── vistas
├── Api.js
└── Database.jssst.json是:
{
"name": "rmo-serverless",
"region": "us-west-2",
"main": "stacks/index.js"
}和stacks/index.js
import { App } from "@serverless-stack/resources";
import { Api } from "./vistas/Api";
import { Database } from "./vistas/Database";
import { Vpc } from "./common/Vpc";
import { Msk } from "./common/Msk";
import { Consumer } from "./posiciones/Consumer";
import { DocumentDB } from "./posiciones/DocumentDB";
/**
* @param {App} app
*/
export default function (app) {
app.setDefaultFunctionProps({ //not needed
runtime: "nodejs14.x",
});
app.stack(Vpc)
.stack(Msk)
.stack(Database)
.stack(DocumentDB)
.stack(Consumer)
.stack(Api);
}正如我前面提到的,我们是基础设施代码(sst)和服务代码(lambdas),在不同的存储库中。
目前,我们正在建造输油管道。简言之,我们有两条管道:
部署indrastructure的
。
我们试图得到的是,当服务代码被推到分支上时,它只会重新部署与服务相关的元素lambdas.
这里的问题是,我们如何只能部署基础设施项目(documentdb、rds、msk、vpc)?或者,我们如何只部署服务项(lambdas,api)?
有什么好的建议来组织这个项目吗?
发布于 2022-08-11 11:25:58
一个建议是使用您的stage名称。例如,您可能在/utils/index.ts中有一个类似于此的助手函数
/**
* A conditional helper function, add Stack based on given `stage` name.
*
* @param {App} app
* @param {string} stage
* @param {any} stack
* @returns void
*/
export const addStackPerStage = (app, stage, stack) => {
if (app.stage === stage) {
app.stack(stack);
}
};然后使用这个助手函数,如下所示:
import { App } from "@serverless-stack/resources";
import { Api } from "./vistas/Api";
import { Database } from "./vistas/Database";
import { Vpc } from "./common/Vpc";
import { Msk } from "./common/Msk";
import { Consumer } from "./posiciones/Consumer";
import { DocumentDB } from "./posiciones/DocumentDB";
import { addStackPerStage } from "./utils";
/**
* @param {App} app
*/
export default function (app) {
app.setDefaultFunctionProps({ //not needed
runtime: "nodejs14.x",
});
// Infrastructure ONLY.
addStackPerStage(app, "infrastructure-only", Vpc);
addStackPerStage(app, "infrastructure-only", Msk);
addStackPerStage(app, "infrastructure-only", Database);
addStackPerStage(app, "infrastructure-only", DocumentDB);
// Service 1 Only
addStackPerStage(app, "service-1-only", Consumer); // use vpc.fromLookup instead
// Service 2 Only
addStackPerStage(app, "service-2-only", Api); // use vpc.fromLookup instead
}然后,您的脚本可以如下所用:
sst deploy --stage=infrastructure-only关于分支名称,您可以使用像https://www.npmjs.com/package/branch-name这样的https://www.npmjs.com/package/branch-name包。然后,重构上面建议的代码基,使用“分支名称”作为新的“标志”,有条件地添加“Stack(S)”。
最后,我将根据以下段落尽我所能回答问题:
What we are trying to get is that when a service code is pushed on branch, it only re-deploy services related elements, lambdas...
Problem here, is how could we only deploy infrastructure items (documentdb, rds, msk, vpc)? Or how could we deploy only service items (lambdas, api)?我希望这个建议能有所帮助。作为我的终端,我使用这个帮助功能在组织单位和N个AWS帐户每个OU,也与资源访问管理器(RAM)等。
奖金:我这周才发现Stack,如果这个构造感兴趣的话,https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_cloudformation.CfnStackSet.html,在这里看一看。如果您也是通过AWS帐户部署堆栈的话,那么非常理想。
。
https://stackoverflow.com/questions/73304447
复制相似问题