- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 CDK 部署 CodePipeline,该 CodePipeline 构建 React 应用程序并将其部署到 S3。所有这些都有效,但我希望部署更新域名以指向该 S3 存储桶。
我已经在 Route53 中定义了区域,但它是由不同的云形成堆栈定义的,因为有很多与此应用程序无关的细节(MX、TXT 等)。我的管道/堆栈设置这些域名的正确方法是什么?
我可以想到两种解决方案:
example.com
代表们staging.example.com
.我没有尝试委托(delegate)区域方法。我有点担心手动维护 staging.example.com
生成的名称服务器。进入我的 CloudFormation 区域 example.com
.
我确实尝试将记录注入(inject)现有区域,但遇到了一些问题。我愿意解决这些问题或以正确的方式执行此操作。
在我的堆栈(底部的完整管道)中,我首先定义并部署到存储桶:
const bucket = new s3.Bucket(this, "Bucket", {...})
new s3d.BucketDeployment(this, "WebsiteDeployment", {
sources: [...],
destinationBucket: bucket
})
然后我尝试检索区域并添加 CNAME
给它:
const dnsZone = route53.HostedZone.fromLookup(this, "DNS zone", {domainName: "example.com"})
new route53.CnameRecord(this, "cname", {
zone: dnsZone,
recordName: "staging",
domainName: bucket.bucketWebsiteDomainName
})
由于缺乏该区域的权限而失败,这是合理的:
[Container] 2022/01/30 11:35:17 Running command npx cdk synth
current credentials could not be used to assume 'arn:aws:iam::...:role/cdk-hnb659fds-lookup-role-...-us-east-1', but are for the right account. Proceeding anyway.
[Error at /Pipeline/Staging] User: arn:aws:sts::...:assumed-role/Pipeline-PipelineBuildSynthCdkBuildProje-1H5AV7C28FZ3S/AWSCodeBuild-ada5ef88-cc82-4309-9acf-11bcf0bae878 is not authorized to perform: route53:ListHostedZonesByName because no identity-based policy allows the route53:ListHostedZonesByName action
Found errors
为了尝试解决这个问题,我添加了 rolePolicyStatements
给我的CodeBuildStep
rolePolicyStatements: [
new iam.PolicyStatement({
actions: ["route53:ListHostedZonesByName"],
resources: ["*"],
effect: iam.Effect.ALLOW
})
]
这在整个文件的上下文中可能更有意义(在这个问题的底部)。那没有效果。我不确定政策声明是否错误,或者我将其添加到了错误的角色。
添加 rolePolicyStatements
后,我跑cdk deploy
这向我展示了这个输出:
> cdk deploy
✨ Synthesis time: 33.43s
This deployment will make potentially sensitive changes according to your current security approval level (--require-approval broadening).
Please confirm you intend to make the following modifications:
IAM Statement Changes
┌───┬──────────┬────────┬───────────────────────────────┬───────────────────────────────────────────────────────────┬───────────┐
│ │ Resource │ Effect │ Action │ Principal │ Condition │
├───┼──────────┼────────┼───────────────────────────────┼───────────────────────────────────────────────────────────┼───────────┤
│ + │ * │ Allow │ route53:ListHostedZonesByName │ AWS:${Pipeline/Pipeline/Build/Synth/CdkBuildProject/Role} │ │
└───┴──────────┴────────┴───────────────────────────────┴───────────────────────────────────────────────────────────┴───────────┘
(NOTE: There may be security-related changes not in this list. See https://github.com/aws/aws-cdk/issues/1299)
部署完成后,我可以在 AWS 控制台中看到一个角色,该角色具有:
{
"Action": "route53:ListHostedZonesByName",
"Resource": "*",
"Effect": "Allow"
}
该角色的 ARN 为 arn:aws:iam::...:role/Pipeline-PipelineBuildSynthCdkBuildProje-1H5AV7C28FZ3S
。我不能 100% 确定权限是否被授予正确的事物。
这是我的整个 CDK 管道:
import * as path from "path";
import {Construct} from "constructs"
import * as pipelines from "aws-cdk-lib/pipelines"
import * as cdk from "aws-cdk-lib"
import * as s3 from "aws-cdk-lib/aws-s3"
import * as s3d from "aws-cdk-lib/aws-s3-deployment"
import * as iam from "aws-cdk-lib/aws-iam"
import * as route53 from "aws-cdk-lib/aws-route53";
export class MainStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StageProps) {
super(scope, id, props)
const bucket = new s3.Bucket(this, "Bucket", {
websiteIndexDocument: "index.html",
websiteErrorDocument: "error.html",
publicReadAccess: true,
})
const dnsZone = route53.HostedZone.fromLookup(this, "DNS zone", {domainName: "example.com"})
new route53.CnameRecord(this, "cname", {
zone: dnsZone,
recordName: "staging",
domainName: bucket.bucketWebsiteDomainName
})
new s3d.BucketDeployment(this, "WebsiteDeployment", {
sources: [s3d.Source.asset(path.join(process.cwd(), "../build"))],
destinationBucket: bucket
})
}
}
export class DeployStage extends cdk.Stage {
public readonly mainStack: MainStack
constructor(scope: Construct, id: string, props?: cdk.StageProps) {
super(scope, id, props)
this.mainStack = new MainStack(this, "MainStack", {env: props?.env})
}
}
export interface PipelineStackProps extends cdk.StackProps {
readonly githubRepo: string
readonly repoBranch: string
readonly repoConnectionArn: string
}
export class PipelineStack extends cdk.Stack {
constructor(scope: Construct, id: string, props: PipelineStackProps) {
super(scope, id, props)
const pipeline = new pipelines.CodePipeline(this, id, {
pipelineName: id,
synth: new pipelines.CodeBuildStep("Synth", {
input: pipelines.CodePipelineSource.connection(props.githubRepo, props.repoBranch, {connectionArn: props.repoConnectionArn}),
installCommands: [
"npm install -g aws-cdk"
],
commands: [
// First build the React app.
"npm ci",
"npm run build",
// Now build the CF stack.
"cd infra",
"npm ci",
"npx cdk synth"
],
primaryOutputDirectory: "infra/cdk.out",
rolePolicyStatements: [
new iam.PolicyStatement({
actions: ["route53:ListHostedZonesByName"],
resources: ["*"],
effect: iam.Effect.ALLOW
})
]
},
),
})
const deploy = new DeployStage(this, "Staging", {env: props?.env})
const deployStage = pipeline.addStage(deploy)
}
}
最佳答案
如果合成阶段失败,您不能依赖 CDK 管道自行修复,因为管道 CloudFormation 堆栈在使用合成阶段输出的 SelfMutate 阶段中发生了更改。您将需要执行以下选项之一来修复管道:
在本地(或管道之外的任何地方,您拥有所需的 AWS IAM 权限)运行 cdk Synth 和 cdk 部署 PipelineStack 。 编辑:您需要暂时将 selfMutatation 设置为 false
才能使其正常工作 ( Reference )
暂时从 MainStack 中删除 route53.HostedZone.fromLookup
和 route53.CnameRecord
,同时仍保留 rolePolicyStatements
更改。提交并推送您的代码,让 CodePipeline 运行一次,确保 Pipeline self 变异并且 IAM 角色具有所需的额外权限。添加回 Route53 构造,提交,再次推送并检查您的代码是否适用于新的更改。
关于amazon-web-services - 使用 CDK 时,如何使我的 CloudFormation/CodePipeline 更新域名以指向 S3 存储桶?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70914401/
有没有办法在试运行模式下运行 AWS cloudformation 更新?因为我意识到 aws validate 不会拾取所有错误,并且当您运行更新时会抛出新错误。 最佳答案 最接近的方法是运行模拟测
我是 cloudformation 的新手,我正在尝试按照 AWS 文档创建具有方法限制的使用计划。我需要定义一个 ApiStage具有 Throttle 属性。 我尝试了以下方法,但收到错误 - 属
我正在整理一个用于运行 cloudformation/sam 的角色/策略,以尽可能地限制访问。是否有一组通用的策略操作应该用于运行 create-stack? 这是一个代码构建,我使用它在应用程序运
我正在尝试创建一个资源,其属性之一不是常量值。听起来像是堆栈参数的工作,只不过它是一个在某些情况下可以采用 Ref 函数形式的字符串。具体来说,如果是初始创建,我希望参数值是对另一个资源的 Ref,如
我的实际任务是: 在 CloudFormation 外部创建 AMI 使用 CloudFormation 从 AMI 启动实例 分离所有现有卷(包括根卷和数据卷) 附加根据最新快照创建的新卷(根卷和数
我在 cloudformation 中有一个启动实例的模板。它工作正常,但它没有创建我在模板中提到的标签。下面是我的模板 { "AWSTemplateFormatVersion": "2010-0
我尝试通过 Cloudformation 使用 AWS Conformance Pack。我创建了一些非常简单的东西: 以下堆栈创建 S3 存储桶 + 一致性包。然后我将一致性包模板存储到另一个 S3
我的目标是编写一个 Lambda 函数,根据标签将角色附加到 EC2 实例。因此,每当创建新的 Ec2 实例时,都必须自动为其附加一个角色。我希望根据 EC2 实例状态更改(正在运行)触发 lambd
我想使用 CloudFormation 配置 OpenVPN,我想我可以从市场获取 AMI ID 并启动它,因为我想启动一个具有 10 个连接的实例,但不幸的是我无法从市场获取 AMI ID 。如何获
我有一个正在创建 ACM 证书的 cloudformation 堆栈。昨天的代码运行良好,因此我将其移至嵌套堆栈中。 该模板来自一个非常漂亮的示例。我有一个托管区域,这就是我请求证书的地方,模板有一个
我目前正在使用 terraform 和 CloudFormation 之间犹豫。有一个问题我还没有看到答案(或者也许,我只是还没有找到它)。 在 terraform 中,您可以为所有事物指定准确的名称
我收到以下错误,但不知道它来自哪里,希望有人可以提供帮助。 模板验证错误:模板格式错误:任何 Properties 成员都必须是 JSON 对象。 cloudformation脚本 { "AWST
我目前将所有参数存储在 Systems Manager Parameter Store 中,并在 CloudFormation 堆栈中引用它们。 我现在陷入了同一 Cloudformation 模板的
我正在创建一条通往互联网网关的公共(public)路由。当我通过 GUI 进行配置时,完全没有问题。当我尝试通过我的 Cloudformation 模板执行此操作时,每次都会失败。这是网关的构建,没有
在cloudformation模板中,有一个输出部分,用于与跨堆栈对话。 如果我们在一个 AWS 账户中只创建一个堆栈,那么这部分不应存在,这样说是否正确? 最佳答案 输出部分可用于通过 Export
我有以下结构(几乎是样板文件)。我的问题是,我在 ParentStack 中定义的映射在 ChildSTack 中可用还是我需要复制它们?我知道我可以将参数传递给 ChildStack,但想知道 Ma
我有一个主 Cloudformation 模板,它调用两个子模板。我运行了第一个模板,并在资源的 Outputs 部分中捕获了输出。我已经在嵌套的第二个模板中使用 ChildStack01 输出值进行
除了Web控制台中的“检查漂移”功能之外,是否还有其他触发器可以进行检查? cloudformation 是否会在堆栈更新之前自动检查偏差? 假设我有一个创建 s3 存储桶的 cf 堆栈。然后我从 W
有没有办法在 CFN 模板中包含自定义验证器? 我知道我们可以像这样添加规则执行: https://aws.amazon.com/blogs/mt/how-to-perform-cross-param
我正在使用 CloudFormation 模板创建 KMS key ,然后使用该模板在另一个模板中创建 IAM 角色,因为它引用了 KMS key 。需要更新创建 KMS key 的堆栈以将 IAM
我是一名优秀的程序员,十分优秀!