2 votes

Utilisation d'AWS CloudFormation pour créer un DBSubnetGroup

J'utilise ECS-CLI (0.4.5) pour lancer un modèle CFN, et j'essaie maintenant de placer un cluster Aurora dans le modèle CFN et de mettre à jour la pile avec un changeset via le SDK CFN.

Je n'arrive pas à comprendre pourquoi il est contrarié par mes sous-réseaux. Les sous-réseaux sont créés par l'appel initial 'ecs-cli up'. Ils sont dans le même vpc que le reste de la pile, ils existent déjà avant que j'essaie de déployer le changeset, et ils sont dans des zones de disponibilité différentes (us-west-2b et us-west-2c).

La seule information que me donne le CFN est que "certains sous-réseaux d'entrée ne sont pas valides".

Défaillance du CFN : CFN Failure

Sous-réseaux : Subnets

Je peux créer un DBSubnetGroup via la console de gestion avec exactement les mêmes sous-réseaux sans aucun problème.

Des idées sur ce qui pourrait ne pas fonctionner ? S'agit-il d'un bogue dans CloudFormation ? Faites-moi savoir si des informations supplémentaires sont nécessaires pour résoudre ce problème.... Honnêtement, je ne sais pas quoi faire

Voici à quoi se résume mon modèle initial (il est intégré à ecs-cli) :

 "PubSubnetAz1": {
        "Type": "AWS::EC2::Subnet",
        "Properties": {
            "VpcId": {
                "Ref": "Vpc"
            },
            "CidrBlock": "10.0.0.0/24",
            "AvailabilityZone": "us-west-2b"
        }
},
"PubSubnetAz2": {
        "Type": "AWS::EC2::Subnet",
        "Properties": {
            "VpcId": {
                "Ref": "Vpc"
            },
            "CidrBlock": "10.0.1.0/24",
            "AvailabilityZone": "us-west-2c"
        }
},
"InternetGateway": {
    "Type": "AWS::EC2::InternetGateway"
},
"AttachGateway": {
    "Type": "AWS::EC2::VPCGatewayAttachment",
    "Properties": {
        "VpcId": {
            "Ref": "Vpc"
        },
        "InternetGatewayId": {
            "Ref": "InternetGateway"
        }
    }
},
"RouteViaIgw": {
    "Type": "AWS::EC2::RouteTable",
    "Properties": {
        "VpcId": {
            "Ref": "Vpc"
        }
    }
},
"PublicRouteViaIgw": {
    "DependsOn": "AttachGateway",
    "Type": "AWS::EC2::Route",
    "Properties": {
        "RouteTableId": {
            "Ref": "RouteViaIgw"
        },
        "DestinationCidrBlock": "0.0.0.0/0",
        "GatewayId": {
            "Ref": "InternetGateway"
        }
    }
},
"PubSubnet1RouteTableAssociation": {
    "Type": "AWS::EC2::SubnetRouteTableAssociation",
    "Properties": {
        "SubnetId": {
            "Ref": "PubSubnetAz1"
        },
        "RouteTableId": {
            "Ref": "RouteViaIgw"
        }
    }
},
"PubSubnet2RouteTableAssociation": {
    "Type": "AWS::EC2::SubnetRouteTableAssociation",
    "Properties": {
        "SubnetId": {
            "Ref": "PubSubnetAz2"
        },
        "RouteTableId": {
            "Ref": "RouteViaIgw"
        }
    }
},

Et ensuite, quand je vais le mettre à jour, j'ajoute ceci :

"DBSubnetGroup": {
    "Type": "AWS::RDS::DBSubnetGroup",
    "Properties": {
        "DBSubnetGroupDescription": "Aurora Subnet Group using subnets from 2 AZs",
        "SubnetIds": {
             "Fn::Join": [
                    ",", [{
                            "Ref": "pubSubnetAz1"
                        },
                        {
                            "Ref": "pubSubnetAz2"
                        }
                    ]
                ]
            }]
        }
    }
}

Le changeset devrait être assez simple...

"Changes": [
    {
      "Type": "Resource",
      "ResourceChange": {
        "Action": "Add",
        "LogicalResourceId": "DBSubnetGroup",
        "ResourceType": "AWS::RDS::DBSubnetGroup",
        "Scope": [],
        "Details": []
      }
    }
]

J'utilise AWSTemplateFormatVersion 2010-09-09 et le JavaScript aws-sdk "^2.7.21".

2voto

rumdrums Points 956

Le problème est que vous concaténiez vos identifiants de sous-réseau en une chaîne. Au lieu de cela, vous devriez les passer dans un tableau. Essayez ceci :

  "PrivateSubnetGroup": {
    "Type": "AWS::RDS::DBSubnetGroup",
    "Properties": {
      "SubnetIds": [
        {
          "Ref": "PubSubnetAz1"
        },
        {
          "Ref": "PubSubnetAz2"
        }
      ],
      "DBSubnetGroupDescription": "Aurora Subnet Group using subnets from 2 AZs"
    }
  }

En outre, je vous recommande vivement d'essayer d'utiliser yaml au lieu de json. Cloudformation le prend maintenant en charge de manière native, ainsi que certaines fonctions de raccourci pour faciliter l'utilisation des références, et je pense qu'à long terme, vous le trouverez beaucoup plus facile à lire et à écrire.

Voici un exemple de la façon dont vous pourriez écrire un json équivalent en yaml :

PrivateSubnetGroup:
  Type: AWS::RDS::DBSubnetGroup
  Properties:
    DBSubnetGroupDescription: Subnet group for Aurora Database
    SubnetIds:
    - !Ref PubSubnetAz1
    - !Ref PubSubnetAz2

2voto

wjordan Points 11

Selon le AWS::RDS::DBSubnetGroup la documentation, le SubnetIDs accepte une liste de chaînes de caractères, pas une CommaDelimitedList ce qui est ce que vous avez fourni dans votre exemple. Vous devriez passer les sous-réseaux dans un tableau JSON directement, sans utiliser la fonction Fn::Join :

"SubnetIds": [
  {"Ref": "pubSubnetAz1"},
  {"Ref": "pubSubnetAz2"}
]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X