Utilisation CodePipeline pour déployer Terraform et les modèles CloudFormation - AWS Directives prescriptives

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Utilisation CodePipeline pour déployer Terraform et les modèles CloudFormation

Notice (Avis)

AWS CodeCommit n'est plus disponible pour les nouveaux clients. Les clients existants de AWS CodeCommit peuvent continuer à utiliser le service normalement. En savoir plus

Dans leDPA, vous utilisez des blocs de construction pour AWS CodePipeline créer des accélérateurs pour Terraform et IaC. CloudFormation Cette section décrit les éléments suivants pour ce cas d'utilisation :

  • Structure de pipeline normalisée

  • Stages et travaux réutilisables

  • Outils intégrés pour les scans de sécurité

Le DPA référentiel contient des dossiers pour Terraform et. CloudFormation Chacun de ces dossiers contient les deux sous-dossiers suivants :

  • pipeline-modules — Ce dossier contient le code permettant de déployer la structure de pipeline normalisée.

  • shared — Ce dossier contient les fichiers ready-to-use buildspec pour les DPA étapes et les tâches.

Prérequis

  • Un actif Compte AWS

  • Autorisations pour approvisionner des ressources à l'aide de modèles IaC

  • Autorisations pour créer des AWS CodeCommit référentiels et des composants CodePipeline

Outils

  • cfn-lint est un linter qui vérifie les JSON modèles par rapport à la CloudFormation YAML spécification des ressources.AWS CloudFormation Il effectue également d'autres contrôles, tels que la vérification de la validité des valeurs des propriétés des ressources et le respect des meilleures pratiques.

  • cfn_nag est un outil open source qui identifie les problèmes de sécurité potentiels dans les CloudFormation modèles en recherchant des modèles.

  • Checkov est un outil d'analyse de code statique qui vérifie les erreurs de configuration liées à la sécurité et à la conformité dans iAc.

  • TFLintest un linter qui vérifie la présence d'erreurs potentielles dans le code Terraform et le respect des meilleures pratiques.

  • tfsec est un outil d'analyse de code statique qui vérifie le code Terraform pour détecter d'éventuelles erreurs de configuration.

Instructions

Création de CodeCommit référentiels

  1. Créez deux CodeCommit référentiels distincts comme suit :

    • common-repo— Ce référentiel contient les bibliothèques partagées, les fichiers buildspec et les dépendances.

    • app-repo— Ce référentiel contient le Terraform ou les CloudFormation modèles pour déployer votre infrastructure.

    Pour obtenir des instructions, consultez la section Création d'un AWS CodeCommit référentiel.

  2. Dans le common-repo dépôt, créez un dossier nomméshared. Copiez les fichiers buildspec du dossier Terraform ou CloudFormationpartagé du GitHub DPA dépôt vers le nouveau dossier. Pour obtenir des instructions, voir Création ou ajout d'un fichier dans un AWS CodeCommit référentiel.

  3. Dans le app-repo référentiel, créez un dossier nomméentrypoint. Copiez le fichier du dossier Terraform ou CloudFormationentrypoint du GitHub DPA dépôt vers le nouveau dossier. Pour plus d'informations sur ces fichiers, consultezComprendre le JSON fichier des points d'entrée.

  4. Passez en revue le répertoire Terraform ou CloudFormationexamples, puis structurez votre app-repo dossier en fonction de ces exemples. Ces annuaires contiennent des exemples de déploiement d'une instance Amazon Elastic Compute Cloud (AmazonEC2) ou d'un bucket Amazon Simple Storage Service (Amazon S3).

  5. Passez à l'une des deux sections suivantes :

Création du pipeline et définition des étapes (Terraform)

  1. Clonez le référentiel DevOps Pipeline Accelerator (DPA) depuis GitHub votre station de travail locale.

  2. Dans le référentiel cloné, accédez au aws-codepipeline/terraform/pipeline-modules dossier.

  3. Dans le fichier terraform.tfvars, mettez à jour et validez l'état de Terraform et les variables spécifiques au rôle (). AWS Identity and Access Management IAM

  4. Créez une image Docker. Pour obtenir des instructions, consultez la section Création d'images Docker pour l'utilisation de in CodeBuild (GitHub).

  5. Mettez à jour la builder_image variable définie dans le fichier terraform.tfvars.

  6. Entrez les commandes suivantes : Cela initialise, prévisualise et déploie l'infrastructure via Terraform.

    terraform init terraform plan terraform apply
  7. Connectez-vous au Compte AWS. Dans la CodePipeline console, vérifiez que le nouveau pipeline a été créé.

    Remarque : Si la première exécution est dans un failed état, répétez l'étape précédente.

  8. Lorsque le nouveau CodePipeline pipeline est créé, un nouveau IAM rôle pour AWS CodeBuild est créé automatiquement. Le nom de ce rôle créé automatiquement se termine par-codebuild-role. Mettez à jour ce rôle avec les autorisations requises pour déployer votre infrastructure.

Créez le pipeline et définissez les étapes (CloudFormation)

  1. Clonez le référentiel DevOps Pipeline Accelerator (DPA) depuis GitHub votre station de travail locale.

  2. Dans le référentiel cloné, accédez au aws-codepipeline/cloudformation/pipeline-modules dossier.

  3. Déployez le modèle CloudFormation pipeline-cft.yaml. Les paramètres obligatoires que vous devez transmettre à la pile sont les suivants.

    • ArtifactsBucket— Nom du dépôt contenant les artefacts du pipeline à mettre à jour

    • EcrDockerRepository— Identifiant de ressource uniforme (URI) du ECR référentiel Amazon avec le image tag

    • CodeCommitAppRepo— Nom du CodeCommit référentiel contenant les modèles

    • CodeCommitBaseRepo— Nom du CodeCommit référentiel contenant les fichiers partagés

    • CodeCommitRepoBranch— Nom de la branche CodeCommit du dépôt

    • SNSMailAddress— Adresse e-mail qui recevra les notifications Amazon Simple Notification Service (AmazonSNS) concernant l'état du pipeline

    Pour obtenir des instructions, consultez la section Utilisation des piles dans la CloudFormation documentation.

  4. Connectez-vous au AWS compte. Dans la CodePipeline console, vérifiez que le nouveau pipeline a été créé.  

  5. Lorsque le nouveau CodePipeline pipeline est créé, un nouveau IAM rôle pour AWS CodeBuild est créé automatiquement. Le nom de ce rôle créé automatiquement se termine par-codebuild-role. Mettez à jour ce rôle avec les autorisations requises pour déployer votre infrastructure.

Comprendre le JSON fichier des points d'entrée

Fichier de point d'entrée Terraform

Il s'agit du fichier de configuration principal. Dans ce fichier, vous pouvez personnaliser et activer ou désactiver une étape. Si vous désactivez une étape, elle ne la supprime ni ne la retire du pipeline. Au lieu de cela, l'étape est ignorée pendant l'exécution.

{ "build_stage_required" : "true", "test_stage_required" : "true", "predeploy_stage_required": "true", "deploy_stage_required": "true", "postdeploy_stage_required": "true", "destroy_stage_required": "true", "bucket":"tf-state-dpa", # S3 bucket used for Terraform backend "key":"terraform_test.tfstate", # S3 key to be used "region":"us-east-1", "dynamodb_table":"tf-state-dpa" # DynamoDB Table for Terraform backend }

CloudFormation fichier de point d'entrée

Il s'agit du fichier de configuration principal. Dans ce fichier, vous personnalisez les étapes et vous les activez ou les désactivez. Si vous désactivez une étape, elle ne la supprime ni ne la retire du pipeline. Au lieu de cela, le pipeline ignore l'étape pendant l'exécution.

{ "init_stage_required" : "true", "test_stage_required" : "true", "createinfra_stage_required": "true", "envType" : "cloudformation", "stage_required" : "true", "cft_s3_bucket" : "pipeline-bucket", #S3 bucket from the destination account to keep CFT templates "stack_name" : "aws-cft-poc", #CloudFormation stack name "account" : "************", #Destination AWS account to deploy stack "roleName" : "codestack-poc-cross-account-role", #Cross-account IAM role name "region" : "us-east-1", "destroy_stack" : "false" #To destroy the provisioned stack, set this value to "true" }