我正在努力创建一种简单的方法来使用 AWS CDK 创建存储桶和 SQS 队列,其中在存储桶中创建的任何对象都将在 SQS 队列中创建消息。我已经能够使其与 AWS CLI 配合使用,但不能与 CDK 配合使用。
我尝试过以下代码:
/**
* --------------------------------------------------
* SQS Queue
* --------------------------------------------------
*/
const queue = new sqs.Queue(this, queueName, {
encryption: sqs.QueueEncryption.UNENCRYPTED,
});
queue.grantSendMessages(new iam.ServicePrincipal('s3.amazonaws.com'));
/**
* --------------------------------------------------
* S3 Bucket
* --------------------------------------------------
*/
const bucket = new s3.Bucket(this, bucketName, {});
bucket.addEventNotification(
s3.EventType.OBJECT_CREATED,
new s3n.SqsDestination(queue)
);
const bucketPolicy = new iam.PolicyStatement({
actions: ['sqs:SendMessage'],
effect: iam.Effect.ALLOW,
principals: [new iam.ServicePrincipal('s3.amazonaws.com')],
resources: [queue.queueArn],
conditions: {
ArnLike: {
'aws:SourceArn': bucket.bucketArn,
},
},
});
queue.addToResourcePolicy(bucketPolicy);
这将创建存储桶和队列(在 Localstack 中),但是运行
aws s3 cp ./some_file.txt s3://bucket_name/some_file.txt
不会在 SQS 队列中创建消息。
这似乎是 Localstack 的问题(不使用 Pro 时),因此我通过条件检查进行了修复,以查看我是否位于 LS 环境中:
const bucket = new s3.Bucket(this, bucketName, {
bucketName,
});
bucket.addEventNotification(
s3.EventType.OBJECT_CREATED,
new s3n.SqsDestination(queue)
);
if (process.env.IS_LOCALSTACK) {
const cfnBucket = bucket.node.defaultChild as s3.CfnBucket;
cfnBucket.notificationConfiguration = {
queueConfigurations: [
{
event: s3.EventType.OBJECT_CREATED,
queue: queue.queueArn,
},
],
};
}