.net 如何使用AWS CDK正确创建和引用托管策略?

d7v8vwbk  于 2023-08-08  发布在  .NET
关注(0)|答案(1)|浏览(116)

我正在尝试从JSON创建托管策略,并在使用AWS CDK和. NET的角色中引用它们。我有两个堆栈- PolicyStack和IAMStack。在升级之前,只有IAMStack负责角色的创建,但现在我需要添加策略创建选项。我在理解文档中策略创建的确切语法时遇到了问题,但到目前为止,程序编译完毕,策略创建完毕。目前,我创建的策略如下:

  1. foreach (var _policy in _policies) { // JSON holding info about policies
  2. var newPolicy = new ManagedPolicy(this, _policy.PolicyName, new ManagedPolicyProps {
  3. Statements = new[] {
  4. new PolicyStatement(new PolicyStatementProps {
  5. Effect = Effect.ALLOW,
  6. Resources = _policy.Resource.ToArray(),
  7. Actions = _policy.Action.ToArray()
  8. })
  9. }
  10. });
  11. }

字符集
第一个问题是创建的策略的名称与指定的名称不同。例如,如果指定的名称为s3-access-policy,则实际的策略名称将以类似PolicyStack-s3accesspolicy-Zlasdf9IfnA的形式结束。
另一个问题是,将托管策略附加到角色的代码引发错误Policy arn:aws:iam::aws:policy/PolicyStack-s3accesspolicy-Zlasdf9IfnA does not exist or is not attachable。PolicyStack在IAMStack和策略创建之前执行,但是我注意到错误中的ARN与策略的实际ARN之间的唯一区别是用户-在错误中,用户是aws,而在实际ARN中,用户是用户的ID,即123456789235。策略通过以下方式附加到角色

  1. role.AddManagedPolicy(ManagedPolicy.FromAwsManagedPolicyName(policy_name));


我有两个问题:

  • 保单名称为何发生变化?
  • 为什么我无法引用托管策略
r6vfmomb

r6vfmomb1#

我对.NET没有信心,但我对AWS CDK很有信心,我会试着给予你一些信息。
我们从身份证开始。

  • 保单名称为何发生变化?

在CDK中,每当你示例化一个Construct对象时,你必须至少传递两个参数:范围和(构造)ID。如documentation所述:
这个标识符[construct id,编者注]和所有标识符一样,只需要在创建它的范围内是唯一的,这是示例化一个construct对象时的第一个参数。
基本上,您是在为Construct对象声明一个ID,而不是像您那样声明策略名称。为此,您应该在示例化属性接口IManagedPolicyProps时显式地为属性ManagedPolicyName给予。
一个附带说明是,每当没有为Construct Object指定资源名称时,CDK就会自动分配一个物理名称(这正是您的情况),以提供对该对象的唯一引用。完整的解释在链接文档中的Unique Id部分下
关于另一个错误:

  • 为什么我无法引用托管策略

你在这里调用了错误的方法。AWS Managed Policy 是一种策略,但不是您刚刚创建的那种策略。后者被称为 * 客户管理 *,以区别于由AWS维护的前一种类型(及时动态更新),而您的策略可能由您自己维护。

的数据
要解决这个问题,必须使用FromManagedPolicyName方法。
我建议你一个替代方案,如果两个堆栈在同一个AWS CDK应用程序中,那么你也可以使用对第一个堆栈中创建的对象的引用。

展开查看全部

相关问题