Я пытаюсь использовать CloudFormation для развертывания корзины S3, которая на ObjectCreate вызывает лямбда-функцию.

Вот мои ресурсы:

"ExampleFunction": {
            "Type": "AWS::Lambda::Function",
            "Properties": {
                "Handler": "index.lambda_handler",
                "Code": {
                    "S3Bucket": "bucketname",
                    "S3Key": "something.zip"
                },
                "Runtime": "python3.6",
                "Role": {
                    "Fn::GetAtt": [
                        "LambdaExecutionRole",
                        "Arn"
                    ]
                }
            }
        },
        "InputDataBucket": {
            "Type": "AWS::S3::Bucket",
            "Properties": {
                "BucketName": "input-data",
                "NotificationConfiguration": {
                    "LambdaConfigurations": [
                        {
                            "Function": {
                                "Ref": "ExampleFunction"
                            },
                            "Event": "s3:ObjectCreated:*",
                            "Filter": {
                                "S3Key": {
                                    "Rules": [
                                        {
                                            "Name": "suffix",
                                            "Value": "zip"
                                        }
                                    ]
                                }
                            }
                        }
                    ]
                }
            }
        },
        "LambdaInvokePermission": {
            "Type": "AWS::Lambda::Permission",
            "Properties": {
                "Action": "lambda:InvokeFunction",
                "FunctionName": {
                    "Fn::GetAtt": [
                        "ExampleFunction",
                        "Arn"
                    ]
                },
                "Principal": "s3.amazonaws.com",
                "SourceAccount": {
                    "Ref": "AWS::AccountId"
                },
                "SourceArn": {
                    "Fn::Join": [
                        ":",
                        [
                            "arn",
                            "aws",
                            "s3",
                            "",
                            "",
                            {
                                "Ref": "InputDataBucket"
                            }
                        ]
                    ]
                }
            }
        }

Я пытался следовать документации конфигурации уведомлений, в которой говорится, что может быть циклическая зависимость. Однако, если я буду следовать инструкциям, я получаю ту же ошибку. Ссылка: https://docs.aws .amazon.com / AWSCloudFormation / latest / UserGuide / aws-properties-s3-bucket-notificationconfig.html

Когда я пытаюсь создать стек, S3 всегда ломает его с ошибкой «ARN неправильно сформирован».

Я много чего пробовал, но всегда получаю одну и ту же ошибку.

5
Miika 30 Дек 2017 в 23:12

1 ответ

Лучший ответ

Я могу заставить это работать, если заранее знаю имя корзины S3 ( mybucketname ниже). Если вы заранее не знаете имя сегмента, вы можете улучшить это, чтобы запросить имя сегмента в качестве параметра стека, и оно все равно должно работать. Если вам нужно, чтобы имя корзины было автоматически сгенерировано (поэтому вы не можете предсказать имя заранее), это не сработает, и вам придется пойти по маршруту создания / обновления.

Ключевым моментом здесь является создание вручную ARN сегмента S3 из известного имени сегмента, а не полагаться на "Ref": "InputDataBucket", чтобы получить имя сегмента.

Также стоит прочитать эту статью поддержки.

{
    "AWSTemplateFormatVersion": "2010-09-09",

    "Description": "stackoverflow-48037497",

    "Resources" : {
        "ExampleFunction": {
            "Type": "AWS::Lambda::Function",
            "Properties": {
                "Handler": "index.lambda_handler",
                "Code": {
                    "S3Bucket": "bucketname",
                    "S3Key": "something.zip"
                },
                "Runtime": "python3.6",
                "Role": {
                    "Fn::GetAtt": [
                        "LambdaExecutionRole",
                        "Arn"
                    ]
                }
            }
        },
        "LambdaInvokePermission": {
            "Type": "AWS::Lambda::Permission",
            "DependsOn": [ "ExampleFunction" ],
            "Properties": {
                "Action": "lambda:InvokeFunction",
                "FunctionName": {
                    "Fn::GetAtt": [
                        "ExampleFunction",
                        "Arn"
                    ]
                },
                "Principal": "s3.amazonaws.com",
                "SourceAccount": {
                    "Ref": "AWS::AccountId"
                },
                "SourceArn": "arn:aws:s3:::mybucketname"
            }
        },
        "InputDataBucket": {
            "Type": "AWS::S3::Bucket",
            "DependsOn": [ "ExampleFunction", "LambdaInvokePermission" ],
            "Properties": {
                "BucketName": "mybucketname",
                "NotificationConfiguration": {
                    "LambdaConfigurations": [
                        {
                            "Function": { "Fn::GetAtt" : [ "ExampleFunction", "Arn" ] },
                            "Event": "s3:ObjectCreated:*"
                        }
                    ]
                }
            }
        }
    }
}
5
jarmod 31 Дек 2017 в 01:22