2016-07-24 9 views
2

Ich versuche, eine Vorlage mit Cloud-Formation zu erstellen, die einen Load Balancer zum Schreiben von Protokollen in S3-Bucket einrichtet. Statt vollen Zugriff auf alle geben (z *), möchte ich PutObject nur Zugriff auf die Load-Balancer-Konto oder eine Dienstleistung beschränken:AWS Cloud-Formation Elastic Load Balancing Kontonummer

{ 
    "Resources": { 
    "LoggingBucketPolicy": { 
     "Type": "AWS::S3::BucketPolicy", 
     "Properties": { 
     "Bucket": { 
      "Ref": "LoggingBucket" 
     }, 
     "PolicyDocument": { 
      "Action": [ 
      "s3:PutObject" 
      ], 
      "Effect": "Allow", 
      "Resource": { 
      "Fn::Join": [ 
       "", 
       [ 
       "arn:aws:s3:::", 
       { 
        "Ref": "LoggingBucket" 
       }, 
       "/*" 
       ] 
      ] 
      }, 
      "Principal": { 
      "Ref": "ElasticLoadBalancingAccountID" //How do I set this dynamically? 
      } 
     } 
     } 
    } 
    } 
} 

Die documentation bietet Konto-IDs von ELB-Instanzen in verschiedenen Regionen. Die Vorlage, die ich erstelle, verfügt jedoch über einen Verfügbarkeitszonenparameter, bei dem der Benutzer eine Verfügbarkeitszone auswählen kann, für die der Stapel bereitgestellt werden soll. Also, was ich im Idealfall tun möchte, ist eine Art ref Variable in meiner Bucket-Richtlinie, die die Konto-ID von Load Balancer basierend auf der Verfügbarkeitszone erhält.

Ich sah auch Beispiele in der official documentation, aber das eine Beispiel, das Ref verwendet, definiert nicht wirklich die Variable.

Wie erreiche ich das?

Bearbeiten: Ich meinte die Verfügbarkeit Zonen statt Region. Der Eingabeparameter bietet dem Benutzer eine Dropdown-Liste mit Verfügbarkeitszonen in einer Region.

Antwort

4

Es gibt keine Variable, die die ELB-Konto-IDs enthält. Dies sind die verschiedenen Konto-IDs von AWS.

Um sich in der Richtlinie enthält, müssen Sie entweder:

  1. Fest Code dieses Konto-IDs,
  2. Verwendung Eingangsgrößen in Ihre Vorlage für sie, oder
  3. versuchen, eine Cloudformation „Karte unter "Um eine Karte der Region-zu-Konto-ID-Liste einzurichten, wählen Sie die entsprechende Liste mit der AWS::Region Variable.
+0

Hi..thank Sie für die Antwort. Ich meine Verfügbarkeitszone anstelle der Region. Ich habe Ihren Vorschlag ausprobiert, bekomme aber einen Fehler: 'Zugriff verweigert für den Bucket: xxxxxxxxxxx.development. Bitte überprüfen Sie die S3bucket-Berechtigung. – MojoJojo

+0

Ich habe eine Ausgabevariable erstellt, um den Wert von '{" Ref ":" AWS :: AccountId "} auszugeben und stellt fest, dass der Wert meiner Konto-ID geschrieben wird Stack und * nicht * die Account-ID, die verwendet wird, um ELB wie hier identifiziert auszuführen: http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/enable-access-logs.html#enable-access-logs-console – MojoJojo

+1

OK. Ich verstehe was du versuchst zu tun. Es gibt keine Variable für das, was Sie wollen. Sie müssen diese Konto-IDs entweder fest codieren oder Eingangsvariablen für Ihre Vorlage verwenden. –

2

Ich fand es heraus. Es ist nicht wirklich dynamisch, aber besser, als nur die ID direkt zu codieren. Wie pro this Amazon re-invent presentation, ist der richtige Weg, um zunächst eine Zuordnung zu definieren:

{ 
    "Mappings": { 
    "RegionalConfigs": { 
     "us-east-1": { 
     "AMI": "", 
     "ELBAccountId": "127311923021", 
     "ArnPrefix": "arn:aws:" 
     }, 
     "us-west-1": { 
     "AMI": "", 
     "ELBAccountId": "027434742980", 
     "ArnPrefix": "arn:aws:" 
     }, 
     "us-west-2": { 
     "AMI": "", 
     "ELBAccountId": "797873946194", 
     "ArnPrefix": "arn:aws:" 
     } 
    } 
    } 
} 

und es dann in einer Richtlinie verwenden:

{ 
    "Resources": { 
    "LoggingBucketPolicy": { 
     "Type": "AWS::S3::BucketPolicy", 
     "Properties": { 
     "PolicyDocument": { 
      "Version": "", 
      "Resource": { 
      "Fn::Join": [ 
       "", 
       [ 
       { 
        "Fn::FindInMap": [ 
        "RegionalConfigs", 
        { 
         "Ref": "AWS::Region" 
        }, 
        "ArnPrefix" 
        ] 
       }, 
       "s3:::", 
       { 
        "Ref": "LoggingBucket" 
       }, 
       "/", 
       "Logs", 
       "/AWSLogs/", 
       { 
        "Ref": "AWS::AccountId" 
       }, 
       "/*" 
       ] 
      ] 
      }, 
      "Principal": { 
      "AWS": { 
       "Fn::FindInMap": [ 
       "RegionalConfigs", 
       { 
        "Ref": "AWS::Region" 
       }, 
       "ELBAccountId" 
       ] 
      } 
      }, 
      "Action": [ 
      "s3:PutObject" 
      ] 
     }, 
     "Bucket": { 
      "Ref": "LoggingBucket" 
     } 
     } 
    } 
    } 
} 
+0

http://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html Vielen Dank, dass Sie diese Lösung vorgeschlagen haben. Der aufgelistete Abschnitt "PolicyDocument" ist jedoch ungültig. Es enthält keinen "Statement" -Block. Nach "PolicyDocument" sollte ein "Statement" -Abschnitt wie folgt aussehen: "Statement": [ {// policy statement //}] – CarlR