Direkt zum Inhalt

Wie übergebe ich Werte zwischen verschachtelten Stacks innerhalb desselben übergeordneten Stacks in AWS CloudFormation?

Lesedauer: 3 Minute
0

Ich möchte einen Wert zwischen zwei verschachtelten Stacks innerhalb desselben übergeordneten Stacks in AWS CloudFormation weitergeben oder teilen.

Lösung

Die folgende Lösung verwendet die AWS::CloudFormation::Stack-Ressourcen NestedStackA und NestedStackB, die Teil desselben übergeordneten Stacks sind, der als RootStack bezeichnet wird. Du übergibst einen Wert von NestedStackA an NestedStackB. NestedStackA hat die S3-Bucket-Ressource erstellt, und NestedStackB hat die S3-Bucket-Richtlinie erstellt, die an den S3-Bucket angehängt ist.

Führe die folgenden Schritte aus:

  1. Gib im Abschnitt Ausgaben deiner CloudFormation-Vorlage für NestedStackA den Wert ein, den du teilen möchtest.
    JSON:

    {
        "Resources": {
            "S3Bucket": {
                "Type": "AWS::S3::Bucket",
                "DeletionPolicy": "Retain",
                "Properties": {
                    "BucketName": "DOC-EXAMPLE-BUCKET"
                }
            }
        },
        "Outputs": {
            "BucketNameOutput": {
                "Value": { "Ref" : "S3Bucket" },
                "Description": "You can refer to any resource from the template."
            }
        }
    }

    YAML:

    Resources:
      S3Bucket:
        Type: 'AWS::S3::Bucket'
        DeletionPolicy: Retain
        Properties:
          BucketName: DOC-EXAMPLE-BUCKET
    Outputs:
      BucketNameOutput:
        Value: !Ref S3Bucket
        Description: You can refer to any resource from the template.

    Hinweis: Ersetze in den vorherigen Vorlagen DOC-EXAMPLE-BUCKET durch deinen Bucket-Namen. Der Abschnitt Ausgaben der vorherigen Vorlagen gibt den Bucket-Namen von !Ref zurück.

  2. Füge im Abschnitt Parameter der CloudFormation-Vorlage für NestedStackB einen Parameter hinzu, um den S3-Bucket-Namen aus der Ausgabe von NestedStackA zu verwenden.
    JSON:

    {
        "Parameters": {
            "BucketNameValueParameter": {
                "Type": "String",
                "Description": "The shared bucket name value from nestedStackA that will be passed to this parameter from the parent stack."
            }
        },
        "Resources": {
            "SampleBucketPolicy": {
                "Type": "AWS::S3::BucketPolicy",
                "Properties": {
                    "Bucket": {
                        "Ref": "BucketNameValueParameter"
                    },
                    "PolicyDocument": {
                        "Version": "2012-10-17",
                        "Statement": [
                            {
                                "Action": [
                                    "s3:GetObject"
                                ],
                                "Effect": "Allow",
                                "Resource": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "arn:aws:s3:::",
                                            {
                                                "Ref": "DOC-EXAMPLE-BUCKET"
                                            },
                                            "/*"
                                        ]
                                    ]
                                },
                                "Principal": "*",
                                "Condition": {
                                    "StringLike": {
                                        "aws:Referer": [
                                            "http://www.example.com/*",
                                            "http://example.net/*"
                                        ]
                                    }
                                }
                            }
                        ]
                    }
                }
            }
        }
    }
    

    YAML:

    Parameters:
      BucketNameValueParameter:
        Type: String
        Description: >-
          The shared bucket name value from nestedStackA that will be passed to this
          parameter from the parent stack.
    Resources:
      SampleBucketPolicy:
        Type: 'AWS::S3::BucketPolicy'
        Properties:
          Bucket: !Ref BucketNameValueParameter
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Action:
                  - 's3:GetObject'
                Effect: Allow
                Resource: !Join
                  - ''
                  - - 'arn:aws:s3:::'
                    - !Ref DOC-EXAMPLE-BUCKET
                    - /*
                Principal: '*'
                Condition:
                  StringLike:
                    'aws:Referer':
                      - 'http://www.example.com/*'
                      - 'http://example.net/*'
  3. Um einen Wert zwischen NestedStackA und NestedStackB zu übertragen, konfiguriere RootStack so, dass die Funktion Fn::GetAtt im Abschnitt Parameter für NestedStackB verwendet wird. Verwende die logische ID von NestedStackA und den Ausgabewert des Bucket-Namens im Format Outputs.NestedStackOutputName.
    JSON:

    {
      "AWSTemplateFormatVersion" : "2010-09-09",
      "Resources" : {
        "NestedStackA" : {
          "Type" : "AWS::CloudFormation::Stack",
          "Properties" : {
            "TemplateURL" : "https://s3.amazonaws.com/<pathway to .template for NestedStack A>"
          }
        },
        "NestedStackB" : {
          "Type" : "AWS::CloudFormation::Stack",
          "Properties" : {
            "TemplateURL" : "https://s3.amazonaws.com/<pathway to .template for NestedStack B>",
            "Parameters" : {
              "BucketNameValueParameter" : {
                "Fn::GetAtt": [
                  "NestedStackA",
                  "Outputs.BucketNameOutput"
                ]
              }
            }
          }
        }
      }
    }

    YAML:

    AWSTemplateFormatVersion: 2010-09-09
    Resources:
      NestedStackA:
        Type: 'AWS::CloudFormation::Stack'
        Properties:
          TemplateURL: 'https://s3.amazonaws.com/<pathway to .template for NestedStack A>'
      NestedStackB:
        Type: 'AWS::CloudFormation::Stack'
        Properties:
          TemplateURL: 'https://s3.amazonaws.com/<pathway to .template for NestedStack B>'
          Parameters:
            BucketNameValueParameter: !GetAtt
              - NestedStackA
              - Outputs.BucketNameOutput

Ähnliche Informationen

Stacks mithilfe verschachtelter Stacks in andere Stacks einbetten

Auszüge aus AWS CloudFormation-Vorlagen

AWS OFFICIALAktualisiert vor einem Jahr