8
votes

Comment définir un nom semi-aléatoire pour le compartiment S3 à l'aide de la formation de nuages

Je souhaite créer un modèle de formation de nuage qui crée un compartiment S3 avec un nom lisible par l'homme, mais qui peut être exécuté plusieurs fois automatiquement. Voici un bucket avec un nom prédéfini.

Que puis-je faire pour que le nom contienne une partie lisible par l'homme en plus d'un identifiant unique aléatoire? Quelque chose comme: MyBucket-abcdabcd , MyBucket-efghefgh , MyBucket-ijklijkl .

"S3Bucket" : {
  "Type" : "AWS::S3::Bucket",
  "Properties" : {
    "BucketName": "MyBucket",
    "PublicAccessBlockConfiguration" : {
      "BlockPublicAcls" : true,
      "BlockPublicPolicy" : true
    }
  }
}


3 commentaires

CloudFormation prend en charge les macros basées sur Lambda qui fonctionneraient pour votre cas d'utilisation. aws.amazon.com/blogs/aws/cloudformation-macros


Je suppose que s'il n'y a rien de intégré, cela pourrait être la réponse.


Je ne veux pas mettre cela comme une réponse, mais peut-être qu'un moteur de création de modèles comme jinja2 pourrait vous faciliter la vie lorsqu'il est utilisé avec des modèles YAML!


3 Réponses :


3
votes

Vous avez deux options.

Première option - vous pouvez simplement laisser votre propriété BucketName vide. Lorsque vous laissez ce champ vide, il donnera le nom: - -

Donc, si vous avez un nom de pile et un nom logique de modèle qui ont du sens, cela devrait vous donner un nom de compartiment unique à chaque fois. p >

Deuxième option - utilisez le suffixe Stack ARN, qui est un guid aléatoire: arn: aws: cloudformation: us-west-2: 123456789012: stack / teststack / 51af3dc0-da77-11e4-872e-1234567db123

!Select [0, !Split[-, !Select [2, !Split [/, !Ref AWS::StackId ]]]]

Cela vous donnerait '51af3dc0-da77 -11e4-872e-1234567db123 » Vous pouvez à nouveau diviser cela et sélectionner une partie si vous le souhaitez.

!Select [2, !Split [/, !Ref AWS::StackId ]]

Vous donne 51af3dc0


0 commentaires

13
votes

Merci Sleeper Smith . C'est une excellente réponse et je cherche une solution à cela depuis un certain temps!


tl; dr

yaml CloudFormation ci-dessous renvoie "bucket -with-semi-random-name-51af3dc0 "

BucketWithSemiRandomName:
  Type: "AWS::S3::Bucket"
  Properties:
    BucketName: !Join
      - "-"
      - - "bucket-with-semi-random-name"
        - !Select
          - 0
          - !Split
            - "-"
            - !Select
              - 2
              - !Split
                - "/"
                - !Ref "AWS::StackId"

Légère erreur d'index dans l'exemple de code a fourni Sleeper Smith . Vous devrez remplacer l'index de sélection comme ci-dessous.

En utilisant le même exemple d'ARN de pile comme réponse d'origine ...

!Select [0, !Split[-, !Select [2, !Split [/, !Ref AWS::StackId ]]]]
!Select [2, !Split [/, !Ref AWS::StackId ]]

L'échantillon de code ci-dessus renvoie l'UUID (index 2) de la pile ARN "51af3dc0-da77-11e4-872e-1234567db123"

arn:aws:cloudformation:us-west-2:123456789012:stack/teststack/51af3dc0-da77-11e4-872e-1234567db123

L'échantillon de code ci-dessus renvoie le premier segment (index 0 ) de l'UUID de la pile ARN "51af3dc0"


Voici le yaml résultant que j'utilise maintenant basé sur Réponse de Sleeper Smith . J'ai combiné un! Join pour fournir plus de contexte au nom du bucket.

BucketWithSemiRandomName:
  Type: "AWS::S3::Bucket"
  Properties:
    BucketName: !Join
      - "-"
      - - "bucket-with-semi-random-name"
        - !Select
          - 0
          - !Split
            - "-"
            - !Select
              - 2
              - !Split
                - "/"
                - !Ref "AWS::StackId"

L'exemple de code ci-dessus renvoie "bucket-with-semi-random-name-51af3dc0" p>


2 commentaires

Rofl, le 3ème des 2 problèmes informatiques les plus difficiles, off par 1 erreur. Merci pour une réponse plus complète et correcte.


Exactement ce dont j'avais besoin.



0
votes

Une autre méthode pourrait être:

Resources:
    MyBucket:
      Type: "AWS::S3::Bucket"
Outputs:
  S3Bucket2:
    Description: "My Bucket" 
    Value: !Ref 'MyBucket'


1 commentaires

Cette méthode créera un nom de compartiment s3 entièrement aléatoire et non semi-aléatoire