Blog

Wie Sie die ID Ihrer Organisation freigeben

Jacco Kulman

Aktualisiert Oktober 15, 2025
5 Minuten

Als Cloud-Ingenieur befinden Sie sich manchmal in einem Kaninchenbau. Normalerweise stolpert man von einem Problem zum nächsten und dann zum nächsten und so weiter. Ich persönlich genieße diese Erfahrung, weil man nie weiß, was man lernen wird. Das einzige wirkliche Problem ist, dass ich manchmal vergesse, warum ich überhaupt dort gelandet bin. Dies ist so ein Fall.

Hier ist meine Rekonstruktion, wie ich glaube, dass ich hierher gekommen bin: Ich habe versucht, die SSM-Parameter zu replizieren. An einem bestimmten Punkt musste ich in der Organisationsstruktur navigieren. Dann habe ich herausgefunden, dass ich eine Ressourcenrichtlinie für die Organisation im Verwaltungskonto erstellen muss. Und - wenn Sie das mit Infrastructure as Code machen wollen - können Sie dafür den Ressourcentyp verwenden. In der AWS-Dokumentation wird erwähnt, dass zu den Attributen dieser Ressource die gehört und die das Format hat. Und weil dies die o-exampleorgid beinhaltet, die ein guter Kandidat für eine solche Replikation ist.

Dann stolperte ich über eine Github-Ausgabe, in der eine Funktion für CloudFormation diskutiert wird, die einen zusätzlichen Pseudo-Parameter für die Id der Organisation enthält. Ich beschloss, ein wenig weiter zu graben. Obwohl Kaninchenlöcher ziemlich tief sein können, sind Sie nie allein...

In der Github-Ausgabe wird um die Implementierung eines {AWS::OrgId} Pseudoparameters gebeten. Nachdem ich das s-Attribut gesehen hatte, dachte ich, ich hätte eine perfekte Lösung für das genannte Problem und beschloss, dies als Kommentar zum Github-Problem mitzuteilen. Hier ist mein erster Versuch, das Problem zu lösen:

(für Leser, die sich nur für die Endlösung und nicht so sehr für die Erzählung interessieren: überspringen Sie diesen Abschnitt und scrollen Sie nach unten)

Resources:
  OrganizationsResourcePolicy:
    Type: AWS::Organizations::ResourcePolicy
    Properties:
      Content:
          Version: 2012-10-17
          Statement:
            - Sid: AllowReadonlyNavigateOrganization
              Effect: Allow
              Principal:
                AWS: '*'
              Action:
                - organizations:ListRoots
                - organizations:ListOrganizationalUnitsForParent
                - organizations:ListAccountsForParent
              Resource: '*'
              Condition:
                StringEquals:
                  aws:PrincipalOrgID": "${aws:PrincipalOrgID}"
  OrganizationParameter:
    Type: AWS::SSM::Parameter
    Properties:
      Name: /organizations/id
      Value: !Select
        - 1
        - !Split 
          - /
          - !GetAtt OrganizationsResourcePolicy.Arn
      Type: String

Mit einem raffinierten Select auf einem Split intrinsic ziehe ich die Id der Organisation heraus und erstelle einen SSM-Parameter davon. Wenn Sie Ihr Verwaltungskonto damit booten, steht Ihnen dieser SSM-Parameter zur Verwendung als Standard- oder dynamischer Parameter in CloudFormation zur Verfügung. Aber... leider... nur in der gleichen Region und nur in diesem Konto. Aber vielleicht wird meine kommende SSM-Parameter-Replikationsfunktion den Tag retten! Nun... vielleicht gibt es eine einfachere Lösung.

Beim Lesen der Dokumentation habe ich gesehen, dass AWS::Organizations::Organization ein besserer Kandidat für die Lösung dieses Problems ist, da es neben einem direkten Id -Attribut auch das RootId -Attribut hat, das sehr nützlich sein kann. Aber diese Ressource kann nicht einfach verwendet werden, wenn Sie bereits eine Organisation in Ihrem Konto haben. (Sehen Sie, wie wir hier auf das nächste Problem gestoßen sind?) Um dieses Problem zu lösen, müssen Sie die Ressource Organisation verwenden. Dazu müssen Sie eine Vorlage erstellen, in der sie die einzige Ressource ist, eine DeletionPolicy hinzufügen und die Importfunktion verwenden.

Resources:
  Organization:
    DeletionPolicy: Retain
    Type: AWS::Organizations::Organization
    Properties:
      FeatureSet: ALL

Sobald Sie den ersten Import durchgeführt haben, können Sie weitere Ressourcen hinzufügen und den Stapel update. In diesem Stapel können Sie mit allen Attributen, die die Organisation hat, machen, was Sie wollen: Arn, Id, ManagementAccountArn, ManagementAccountEmail, ManagementAccountId and RootId.

Das Ziel ist es also, andere Konten/Regionen über die Id zu informieren. Als ich die Liste der CloudFormation-Ressourcen durchging, stieß ich auch auf StackSet und dachte, das könnte ein guter Kandidat für die Verteilung sein. Nachdem ich ein wenig herumgespielt hatte, kam ich auf diese Lösung:

(Für die überspringenden Leser: Sie können diese Vorlage nicht direkt verwenden. Sie müssen mit dem Import der Vorlage direkt über dieser Vorlage beginnen)

Parameters:
  Regions:
    Type: CommaDelimitedList
    Default: us-east-1,eu-central-1,eu-west-1,eu-west-2,eu-west-3
Resources:
  Organization:
    DeletionPolicy: Retain
    Type: AWS::Organizations::Organization
    Properties:
      FeatureSet: ALL
  ParameterStackSet:
    Type: AWS::CloudFormation::StackSet
    Properties:
      StackSetName: OrganizationParameterStack
      PermissionModel: SERVICE_MANAGED
      AutoDeployment:
        Enabled: True
        RetainStacksOnAccountRemoval: True
      ManagedExecution:
        Active: true
      StackInstancesGroup:
        - DeploymentTargets:
            OrganizationalUnitIds: 
              - !GetAtt Organization.RootId
            Accounts:
              - !Sub '${AWS::AccountId}'
          Regions: !Ref Regions
      TemplateBody: !Sub
        - |
          {
            "AWSTemplateFormatVersion": "2010-09-09",
            "Resources": {
              "AtLeastOneResource": {
                "Type": "AWS::CloudFormation::WaitConditionHandle"
              }
            },
            "Outputs": {
              "OrganizationId": {
                "Description": "Id of the Organization",
                "Value": "${OrganizationId}",
                "Export": {
                  "Name": "organizationId"
                }
              }
            }
          }
        - OrganizationId: !GetAtt Organization.Id

Es funktioniert!!!

Ich habe mich für einen output statt für einen ssm-Parameter entschieden. Denn die Ausgaben sind etwas strenger (besser?) Sie können sie nicht ändern oder entfernen, während sie importiert werden. (Dies ist eine Funktion, die ich auch für meine Funktion zur Replikation von ssm-Parametern suche). Intern führt CloudFormation eine Referenzzählung für sie durch.

Ein Problem bei dieser Lösung ist, dass das StackSet nicht an das Verwaltungskonto selbst verteilt wird. Vielleicht können Sie das erreichen, wenn Sie nicht SERVICE_MANAGED verwenden, aber ich habe mich geweigert, noch tiefer zu fallen ;-)

Hinweis: Ich habe mit Fn::ToJsonString experimentiert und alles in yaml untergebracht, was auch funktioniert, aber Sie brauchen auch das zusätzliche Transform: 'AWS::LanguageExtensions'. Dieses benötigt irgendwie alle IAM-Warnungs-Kontrollkästchen bei jeder Bereitstellung. Also habe ich beschlossen, das nicht zu verwenden. Keine Zeit mehr für zusätzliche Löcher, in die man fallen kann, denn es ist fast Zeit, das Abendessen zu kochen.

Sie können hier viele Parameter hinzufügen, die dann für das gesamte Unternehmen und alle Regionen gelten. Ist meine Funktion ssm parameter replicator jetzt überflüssig? Ich denke nicht, denn diese Lösung kann meinen Anwendungsfall immer noch nicht bewältigen: eine Ressource in einem Konto erstellen, ein Attribut dieser Ressource für (einen Teil) der Organisation freigeben, die Verwendung der Ressource referenzieren lassen, Race Conditions korrekt behandeln. Ich schätze also, dass ich es immer noch implementieren muss, wenn ich mich lange genug aus den Kaninchenlöchern heraushalten kann.

Verfasst von

Jacco Kulman

Jacco is a Cloud Consultant at Binx.io. As an experienced development team lead he coded for the banking- and hospitality- and media-industries. He is a big fan of serverless architectures. In his free time he reads science fiction, contributes to open source projects and enjoys being a life-long-learner.

Contact

Let’s discuss how we can support your journey.