0

Ich versuche CloudFormation zu verwenden, um einen S3-Bucket bereitzustellen, der auf ObjectCreate eine Lambda-Funktion aufruft.Cloud-Bildung: S3 mit Lambda verknüpft gibt Die ARN ist nicht wohlgeformt

Hier sind meine Ressourcen:

"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" 
 
          } 
 
         ] 
 
        ] 
 
       } 
 
      } 
 
     }

Ich habe versucht, die Dokumentation der Benachrichtigungskonfiguration zu folgen, die, dass es sagt, kann eine zirkuläre Abhängigkeit sein. Wenn ich jedoch den Anweisungen folge, bekomme ich den gleichen Fehler. Referenz: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfig.html

Wenn ich versuche, den Stapel zu erstellen, die S3 bricht es immer mit Fehlern „Der ARN ist nicht wohlgeformt“

Ich habe viele Dinge ausprobiert, aber ich erhalte immer diese gleichen Fehler.

+0

Erstellen Sie die S3-Bucket- und Lambda-Funktion allein in der anfänglichen CF-Erstellung, fügen Sie die NotificationConfiguration zur Vorlage hinzu und führen Sie schließlich eine CF-Aktualisierung durch? Verwenden Sie für die Berechtigung SourceArn einfach "Fn :: GetAtt": ["InputDataBucket", "Arn"]. – jarmod

+0

Es gibt auch eine IAM-Rolle, aber sonst nichts. Ich habe versucht, die NotificationConf zu entfernen und es dann damit zu aktualisieren, aber ich erhalte immer noch den gleichen Fehler. – Miika

Antwort

1

Ich kann dies zur Arbeit, solange ich den S3-Bucket-Namen im Voraus kennen (mybucketname unten). Wenn Sie den Bucket-Namen nicht im Voraus kennen, können Sie dies erweitern, um den Bucket-Namen als Stack-Parameter anzufordern, und er sollte weiterhin funktionieren. Wenn Sie möchten, dass der Bucket-Name automatisch generiert wird (damit Sie den Namen nicht im Voraus vorhersagen können), wird dies nicht funktionieren und Sie müssen auf die Create/Update-Route gehen.

Wichtig ist hier, dass Sie den S3-Bucket-ARN manuell aus dem bekannten Bucket-Namen erstellen, anstatt sich auf "Ref": "InputDataBucket" zu verlassen, um den Bucket-Namen für Sie abzurufen.

Auch lesenswert this support article.

{ 
    "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:*" 
         } 
        ] 
       } 
      } 
     } 
    } 
} 
Verwandte Themen