Как мне прикрепить объект "PolicyDocument" к TopicPolicy с помощью AWS CDK?
Простите, я впервые задаю вопрос о переполнении стека. Я постараюсь сделать это как можно более понятным.
Эта проблема:
Я получаю эту ошибку командной строки при попытке синтезировать стек с помощью AWS CDK. Я использую C# как мой язык и просто играю на своей локальной машине.
Похоже, я не передаю объект "документ политики" при создании объекта моей темы политики на основе этой документации. В документации в разделе "CfnTopicPolicyProps (interface)" показано, что могут быть включены как объект разделов, так и объект policyDocument. Тем не менее, в Visual Studio, когда я смотрю на определение интерфейса, он включает только объект themes. Я включил мое использование интерфейса ниже и определения для некоторых классов, интерфейсов и их родителей. Я относительно новый разработчик, но я совершенно не понимаю объяснений. Что мне здесь не хватает?
Спасибо всем заранее за любую помощь или совет, который вы можете предоставить.
Вывод ошибки CLI
C:\MyRepository\awsCdkApp1>cdk synth Test-Stack-1
Unhandled Exception: Amazon.JSII.Runtime.JsiiException: While synthesizing Test-Stack-1/topicPolicy/Resource: Supplied properties not correct for "CfnTopicPolicyProps"
policyDocument: required but missing
at Amazon.JSII.Runtime.Services.Client.TryDeserialize[TResponse](String responseJson)
at Amazon.JSII.Runtime.Services.Client.ReceiveResponse[TResponse]()
at Amazon.JSII.Runtime.Deputy.DeputyBase.<InvokeMethodCore>g__GetResult|18_0[T](<>c__DisplayClass18_0`1& )
at Amazon.JSII.Runtime.Deputy.DeputyBase.InvokeMethodCore[T](JsiiMethodAttribute methodAttribute, Object[] arguments, Func`3 beginFunc, Func`3 invokeFunc)
at Amazon.JSII.Runtime.Deputy.DeputyBase.InvokeInstanceMethod[T](Object[] arguments, String methodName)
at Amazon.CDK.App.Run()
at HelloCdk.Program.Main(String[] args) in C:\MyRepository/Program.cs:line 19
(node:16396) UnhandledPromiseRejectionWarning: Error: EPIPE: broken pipe, write
at Object.writeSync (fs.js:569:3)
at t.SyncStdio.writeBuffer (C:\Users\username\AppData\Local\Temp\4k3fctka.rty\jsii-runtime.js:1:165352)
at t.SyncStdio.writeLine (C:\Users\username\AppData\Local\Temp\4k3fctka.rty\jsii-runtime.js:1:164892)
at t.InputOutput.write (C:\Users\username\AppData\Local\Temp\4k3fctka.rty\jsii-runtime.js:1:164341)
at t.KernelHost.writeError (C:\Users\username\AppData\Local\Temp\4k3fctka.rty\jsii-runtime.js:1:79440)
at i.then.catch.e (C:\Users\username\AppData\Local\Temp\4k3fctka.rty\jsii-runtime.js:1:79101)
(node:16396) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:16396) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
Subprocess exited with error 3762504530
Использование интерфейса:
var topic = new Topic(this, "myTopic", new TopicProps
{
DisplayName = "myTopic",
TopicName = "myTopic"
});
var topicRef = TopicRef.Import(this, "reference", new TopicRefProps
{
TopicArn = topic.TopicArn,
TopicName = topic.TopicName,
});
var policyStatement1 = new PolicyStatement(0);
policyStatement1.Describe("Default");
policyStatement1.AddAwsPrincipal("*");
policyStatement1.AddActions("- SNS:Publish\n " +
"- SNS:RemovePermission\n" +
"- SNS:SetTopicAttributes\n" +
"- SNS:DeleteTopic\n" +
"- SNS:ListSubscriptionsByTopic\n" +
"- SNS:GetTopicAttributes\n" +
"- SNS:Receive\n" +
"- SNS:AddPermission\n" +
"- SNS:Subscribe\n");
policyStatement1.AddCondition("StringEquals", "sOmEtHiNg");
policyStatement1.AddResource(topic.TopicArn);
var policyStatement2 = new PolicyStatement(0);
policyStatement2.Describe("ProviderBucketAllow");
policyStatement2.AddAwsPrincipal("*");
policyStatement2.AddAction("- SNS:Publish");
policyStatement2.AddCondition("StringEquals", @"sOmEtHiNg");
policyStatement2.AddResource(topic.TopicArn);
var policyDocument = new PolicyDocument("PolicyDocument");
policyDocument.AddStatement(policyStatement1);
policyDocument.AddStatement(policyStatement2);
//Generate the topic policy resource
var topicPolicy = new TopicPolicy(this, "topicPolicy", new TopicPolicyProps
{
//Here is where I would imagine I pass the policyDocument Object?
//If I try to pass policyDocument, I get a ton of errors...
Topics = new[] {topicRef}
});
Определение TopicRefProps:
using Amazon.JSII.Runtime.Deputy;
namespace Amazon.CDK.AWS.SNS
{
public class TopicRefProps : DeputyBase, ITopicRefProps
{
public TopicRefProps();
[JsiiProperty("topicArn", "{\"primitive\":\"string\"}", true)]
public string TopicArn { get; set; }
[JsiiProperty("topicName", "{\"primitive\":\"string\"}", true)]
public string TopicName { get; set; }
}
}
Определение ITopicRefProps:
using Amazon.JSII.Runtime.Deputy;
namespace Amazon.CDK.AWS.SNS
{
[JsiiInterface(typeof(ITopicRefProps), "@aws-cdk/aws-sns.TopicRefProps")]
public interface ITopicRefProps
{
[JsiiProperty("topicArn", "{\"primitive\":\"string\"}", false)]
string TopicArn { get; set; }
[JsiiProperty("topicName", "{\"primitive\":\"string\"}", false)]
string TopicName { get; set; }
}
}
Определение заместителя базы:
using System;
using System.Runtime.CompilerServices;
namespace Amazon.JSII.Runtime.Deputy
{
public abstract class DeputyBase
{
protected DeputyBase(DeputyProps props = null);
protected DeputyBase(ByRefValue reference);
public ByRefValue Reference { get; }
protected static T GetStaticProperty<T>(Type type, [CallerMemberName] string propertyName = null);
protected static T InvokeStaticMethod<T>(Type type, object[] arguments, [CallerMemberName] string methodName = null);
protected static void InvokeStaticVoidMethod(Type type, object[] arguments, [CallerMemberName] string methodName = null);
protected static void SetStaticProperty<T>(Type type, T value, [CallerMemberName] string propertyName = null);
protected T GetInstanceProperty<T>([CallerMemberName] string propertyName = null);
protected T InvokeInstanceMethod<T>(object[] arguments, [CallerMemberName] string methodName = null);
protected void InvokeInstanceVoidMethod(object[] arguments, [CallerMemberName] string methodName = null);
protected void SetInstanceProperty<T>(T value, [CallerMemberName] string propertyName = null);
public sealed class DeputyProps
{
public DeputyProps(object[] arguments = null);
public object[] Arguments { get; }
}
}
}
1 ответ
Здесь есть пара вещей...
-
Topic
класс является действительнымTopicRef
так что вам не нужно делатьTopicRef.import
танцуй здесь. - Ты можешь использовать
Topic#addToResourcePolicy
добавить заявления к вашемуTopic
политика, а не созданиеTopicPolicy
ресурс самостоятельно.
Таким образом, ваш код может в конечном итоге что-то вроде:
var topic = new Topic(this, "myTopic", new TopicProps
{
DisplayName = "myTopic",
TopicName = "myTopic"
});
topic.AddToResourcePolicy(new PolicyStatement()
.Describe("Default")
.AddAwsPrincipal("*")
.AddActions("sns:Publish",
"sns:RemovePermission",
"sns:SetTopicAttributes",
"sns:DeleteTopic",
"sns:ListSubscriptionsByTopic",
"sns:GetTopicAttributes",
"sns:Receive",
"sns:AddPermission",
"sns:Subscribe")
.AddCondition("StringEquals", /* needs to be a map of condition key to value */);
topic.AddToResourcePolicy(new PolicyStatement()
.Describe("ProviderBucketAllow")
.AddAwsPrincipal("*")
.AddAction("sns:Publish")
.AddCondition("StringEquals", /* needs to be a map of condition key to value */);