干杯我正在尝试弄清楚在使用外部提供者时如何使用明确的角色定义来定义提供者。我相信,当我尝试让一个角色扮演另一个角色时,这会给我带来错误,并且对于特定的模块,我会遇到错误。 当我使用 SSO 角色时,该角色在与我尝试执行 terraform 的帐户相同的帐户中具有正确的权限,我可以正常工作。基本上:目标是打造可应用于广泛环境的超级平台角色。
模块的初始错误。当使用不具有直接权限且依赖于假设的角色时。 “所担任的角色在环境中具有管理员才能申请”
staticAssets_foundations_dev │ Error: reading S3 Bucket (di-static-assets-dev-***): operation error S3: HeadBucket, https response error StatusCode: 403, RequestID: 0XWPD9AT06B2P7RS, HostID: eC6Qs4f8EjPo6QWCzloe9qdqyh+8nBu3dY9BHhgIL4MyZQ8ClD6Ta6qKRzyS0rSG2DH7SR0X8js=, api error Forbidden: Forbidden
│
│ with aws_s3_bucket.cloudfrontS3_cloudfrontS3Bucket_DB901A19 (cloudfrontS3/cloudfrontS3Bucket),
│ on cdk.tf.json line 325, in resource.aws_s3_bucket.cloudfrontS3_cloudfrontS3Bucket_DB901A19 (cloudfrontS3/cloudfrontS3Bucket):
│ 325: }
│
╵
staticAssets_foundations_dev ╷
│ Error: reading Amazon CloudFront Origin Access Identity (EC5UYRVYS0TS8): AccessDenied: Access Denied.
│ status code: 403, request id: 5dcbf0bd-1e6e-4174-9d27-3b2ab52006ee
│
│ with module.cloudfrontS3_407A5D96.aws_cloudfront_origin_access_identity.this["s3_bucket_one"],
│ on .terraform/modules/cloudfrontS3_407A5D96/main.tf line 6, in resource "aws_cloudfront_origin_access_identity" "this":
│ 6: resource "aws_cloudfront_origin_access_identity" "this" {
│
使用既具有直接权限又允许承担相同角色的角色时不会出现错误。 (环境特定的 SSO 角色) 我想知道我是否需要将提供程序专门传递给模块(cloudfront)。但如果是这样,我不明白如何。
import { TerraformOutput } from "cdktf";
import { S3BucketPolicy } from "@cdktf/provider-aws/lib/s3-bucket-policy";
import { AwsProvider } from "@cdktf/provider-aws/lib/provider";
import { TerraformProvider } from "cdktf/lib/terraform-provider";
----
export class CloudfrontS3Construct extends Construct {
public distribution: Cloudfront;
public certificate: AcmCertificate;
constructor(scope: Construct, name: string, props: CloudfrontS3Props) {
super(scope, name);
const usEastProvider = new AwsProvider(this, 'usEastProvider', {
region: 'us-east-1',
roleToAssume: 'some-fancy-role'
});
const cloudfrontS3Bucket = new S3Bucket(this, "cloudfrontS3Bucket", {
bucket: props.s3OverrideName ?? `di-${props.tags.Application}-${props.env}-${props.accountNumber}`,
tags: props.tags,
});
let domainName = props.hostedZoneName;
if (props.recordName !== props.hostedZoneName) {
domainName = `${props.recordName}.${props.hostedZoneName}`;
}
this.certificate = new AcmCertificate(this, "certificate", {
domainName: domainName,
validationMethod: "DNS",
tags: props.tags,
//provider: usEastProvider,
subjectAlternativeNames: [domainName],
});
const CLOUDFRONT_ORGIN_ACCESS_COMMENT = "Terraform managed origin s3 bucket";
this.distribution = new Cloudfront(this, name, {
providers: [
usEastProvider as TerraformProvider, ## WHere the error shows up.
],`
尝试定义提供者时出现错误。
类型“TerraformProvider”不可分配给类型“TerraformProvider |” TerraformModuleProvider'。 类型 'import("/Users//di-cdktf-ts-lib/src/node_modules/cdktf/lib/terraform-provider").TerraformProvider' 不可分配给类型 'import("/Users//git /com.github/**/di-cdktf-ts-lib/node_modules/cdktf/lib/terraform-provider").TerraformProvider'。 属性“synthesizeAttributes”受到保护,但类型“TerraformProvider”不是从“TerraformProvider”派生的类。ts(2322)
使用另一个帐户中的角色,使用模块中的假设角色逻辑,使用 terraform 部署 cloudfront 模块。发生的情况是,当假定的角色应该拥有所有访问权限时,我会遇到拒绝错误。我尝试为模块添加显式提供者。但我不明白如何在 CDKTF 中做到这一点。
发现问题了。我们错误地做的是通过在默认提供程序中引入“别名”字段来摆脱默认的 terraform aws 提供程序。因为我们需要以编程方式指定别名。 仅使 sso 上下文成为有效的“提供者”。 terraform 中的重要文档
默认提供商配置 不带别名参数的提供程序块是该提供程序的默认配置。未设置提供程序元参数的资源将使用与资源类型名称的第一个单词匹配的默认提供程序配置。 (例如,除非另有说明,aws_instance 资源使用默认的 aws 提供程序配置。)
如果提供程序的每个显式配置都有别名,Terraform 将使用隐含的空配置作为该提供程序的默认配置。 (如果提供者有任何必需的配置参数,当资源默认为空配置时,Terraform 将引发错误。)