Wie man

So validieren Sie CloudFormation-Vorlagen mit cfn-lint und cfn-nag

So validieren Sie CloudFormation-Vorlagen mit cfn-lint und cfn-nag

In diesem Artikel erfahren Sie, wie Sie ihre CloudFormation-Vorlage mit den Tools cfn-lint und cfn-nag validieren. Außerdem wird erläutert, wie Sie eine Pipeline erstellen, die eine CloudFormation-Vorlage validiert und in CloudFormation bereitstellt.

Es ist eine gute DevOps-Praxis, immer einen Schritt einzuschließen, um unseren Code/ unsere Vorlagen auf Sicherheits- und Syntaxfehler zu überprüfen. Außerdem erspart es uns in unserem Fall, dass eine Pipeline aufgrund von Syntaxfehlern ausfällt.

Voraussetzungen/Voraussetzungen

Bauspezifikation.yml-Inhalt

Das Bauspezifikation.yml Die in unser CodeCommit-Repository hochgeladene Datei sollte den folgenden Code enthalten.

Zuerst werden die Tools cfn-lint und cfn-nag installiert. Dann überprüft es die CloudFormation-Vorlage mit den beiden Tools.

Version: 0.2 Phasen: installieren: Laufzeitversionen: Ruby: 2.6 Befehle: - pip3 install awscli --upgrade --quiet - pip3 install cfn-lint --quiet - apt-get install jq git -y -q - gem install cfn-nag build: Befehle: - cd ./ - cfn-lint ECR.yaml - cfn_nag_scan -i ECR.jaml

Wo ECR.jaml sollte durch den Namen der Vorlage ersetzt werden, die Sie validieren möchten. Ihre Cloudformation-Vorlage muss in das CodeCommit-Repository hochgeladen werden.

CloudFormation cfn-lint

Die Verwendung von cfn-lint ermöglicht Syntaxfehlerprüfungen in Ihrer CloudFormation-Vorlage. Um Ihre Vorlage zu überprüfen, führen Sie den folgenden Befehl aus. Angenommen, unsere Vorlage ist im YAML-Format geschrieben.

cfn-lint Vorlagenname.jaml

CloudFormation cfn-nag

Das cfn-nag-Tool dient zur Sicherheitsüberprüfung. Es untersucht die CloudFormation-Vorlage auf unsichere Infrastrukturen, z.G. Sicherheitsgruppen, die den Zugriff für alle ermöglichen. Um Ihre Vorlage zu überprüfen, führen Sie den folgenden Befehl aus. Angenommen, unsere Vorlage ist im YAML-Format geschrieben.

cfn_nag_scan -i Vorlage.jaml

Erstellen Sie ein CodeBuild-Projekt

Wir werden ein CodeBuild-Projekt erstellen, um unsere CloudFormation-Vorlage zu überprüfen und zu validieren, bevor wir sie in CloudFormation bereitstellen. Wir verwenden die folgende CloudFormation-Vorlage, um unser Build-Projekt zu erstellen create.

AWSTemplateFormatVersion: "2010-09-09" Beschreibung: "Vorlage zum Erstellen eines Codebuild-Projekts" Parameter: ProjectName: Typ: Zeichenfolge Beschreibung: Der CodeBuild-Projektname Standard: Validate-CF-Template CodeBuildRole: Typ: Zeichenfolge Beschreibung: Der Name der Codebuild-Rolle Standard : CodeBuild-ValidateCF-Ressourcen: IAMRole: Typ: 'AWS::IAM::Role' Eigenschaften: Beschreibung: Die CodeBuild Validate CF-Vorlagenrolle Rollenname: !Ref CodeBuildRole AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effekt: Allow Principal: Service: - codebuild.Amazonaws.com Aktion: - 'sts:AssumeRole' ManagedPolicyArns: - arn:aws:iam::aws:policy/AWSCodeBuildAdminAccess - arn:aws:iam::aws:policy/CloudWatchLogsFullAccess - arn:aws:iam::aws:policy/AWSCodeCommitFullAccess - arn:aws:iam::aws:policy/AmazonS3FullAccess Tags: - Schlüssel: "Projekt" Wert: "test-blog" - Schlüssel: "Umgebung" Wert: "test" - Schlüssel: "createdBy" Wert: "Maureen Barasa " - Schlüssel: "Name" Wert: !Ref CodeBuildRole BuildProject: Typ: AWS::CodeBuild::Project Properties: Name: !Ref ProjectName Description: Projekt erstellen, um unsere CF-Vorlagen-Servicerolle zu validieren: !Ref IAMRole Artefakte: Typ: NO_ARTIFACTS Umgebung: Typ: LINUX_CONTAINER ComputeType: BUILD_GENERAL1_SMALL Image: aws/codebuild/standard:4.0 PrivilegedMode: true Quelle: Ort: https://git-codecommit.eu-zentral-1.Amazonaws.com/v1/repos/test-lint Typ: CODECOMMIT BuildSpec: buildspec.yml TimeoutInMinutes: 15 Tags: - Schlüssel: "Projekt" Wert: "test-blog" - Schlüssel: "Umgebung" Wert: "test" - Schlüssel: "createdBy" Wert: "Maureen Barasa" - Schlüssel: "Name" Wert: !Ref ProjectName Ausgaben: Projekt: Beschreibung: Das Codebuild-Build-Projekt Wert: !Ref ProjectName Export: Name: "BuildProject" Wert: !Ref Projektname 

Zuerst beginnt die Vorlage mit der Bereitstellung einer CodeBuild-Rolle. Dann erstellt es das Build-Projekt.

Hinweis: Der Benutzer sollte die Vorlage anpassen. Die Namen von Ressourcen, Eigenschaften und Tags sollten den spezifischen Anforderungen des Benutzers entsprechen.

Wenn Sie das Build-Projekt ausführen, erhalten Sie die folgende Ausgabe:

Projektergebnisse erstellen

Sobald unsere Vorlage validiert ist, erhalten wir Ergebnisse, die alle Fehler oder Warnungen anzeigen. Meine Vorlage weist keine Syntax- oder Sicherheitsfehler auf, aber ich habe 1 Warnung.

Falls wir einen Fehler haben, wird das Build-Projekt fehlschlagen. Zum Beispiel, wenn wir einen Syntaxfehler in unserer Vorlage haben. Siehe Ergebnisse unten.

Build-Projektfehlerergebnisse

Erstellen Sie eine CodePipeline, um die Vorlage in CloudFormation bereitzustellen

Wir können das obige Build-Projekt zu einer Pipeline hinzufügen, um unsere CloudFormation-Vorlage bereitzustellen. Verwenden Sie die folgende Vorlage, um eine Pipeline zu erstellen, die Ihre CloudFormation-Vorlage validiert und sie für die Bereitstellung von Ressourcen in CloudFormation bereitstellt.

AWSTemplateFormatVersion: "2010-09-09" Beschreibung: "Vorlage zum Erstellen von Codepipeline" Parameter: PipelineName: Typ: String Description: Der CodePipeline Name Standard: Deploy-to-CloudFormation Stack: Typ: String Beschreibung: Der Cloudformation Stack Name Standard: eu -central-1-create-ECR-Stack PipelineRole: Typ: String Beschreibung: Der Cloudformation Deploy Rollenname Standard: codepipeline-ECR CFRole: Typ: String Beschreibung: Der CodePipeline Rollenname Standard: codepipeline-cloudformation CWEventsRole: Typ: String Beschreibung: Der Rollenname von Cloudwatch Events Standard: codepipeline-cwevents BucketName: Typ: String Beschreibung: Der vpc, auf dem sich unsere Bastion-Hosts befinden werden Standard: maureen-test-cp Ressourcen: S3: Typ: AWS::S3::Bucket-Eigenschaften: AccessControl: Private BucketEncryption: ServerSideEncryptionConfiguration: - ServerSideEncryptionByDefault: SSEAlgorithm: AES256 BucketName: !Ref BucketName PublicAccessBlockConfiguration: BlockPublicAcls: TRUE BlockPublicPolicy: TRUE IgnorePublicAcls: TRUE RestrictPublicBuckets: TRUE VersioningConfiguration: Status: Enabled Tags: - Schlüssel: "Projekt" Wert: "test-blog" - Schlüssel: "Umgebung" Wert: "test" - Schlüssel: "createdBy" Wert: "Maureen Barasa" - Schlüssel: "Name" Wert: !Ref BucketName CodePipelineRole: Typ: 'AWS::IAM::Role' Eigenschaften: Beschreibung: Der Rollenname der CodeBuild Validate CF-Vorlage: !Ref PipelineRole AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effekt: Allow Principal: Service: - "codepipeline.Amazonaws.com" Aktion: - 'sts:AssumeRole' Policies: - PolicyName: root PolicyDocument: Version: 2012-10-17 Anweisung: - Effekt: Allow Action: - 'iam:PassRole' Ressource: '*' ManagedPolicyArns: - arn:aws :iam::aws:policy/AWSCodePipeline_FullAccess - arn:aws:iam::aws:policy/AWSCodeCommitFullAccess - arn:aws:iam::aws:policy/AmazonS3FullAccess - arn:aws:iam::aws:policy/AWSCodeBuildAdminAccess - arn :aws:iam::aws:policy/AWSCodeDeployFullAccess - arn:aws:iam::aws:policy/AWSCloudFormationFullAccess Tags: - Schlüssel: "Projekt" Wert: "test-blog" - Schlüssel: "Umgebung" Wert: "test" - Schlüssel: "createdBy" Wert: "Maureen Barasa" - Schlüssel: "Name" Wert: !Ref PipelineRole CloudFormationRole: Typ: 'AWS::IAM::Role' Eigenschaften: Beschreibung: Die CodeBuild Validate CF-Vorlagenrolle Rollenname: !Ref CFRole AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Auswirkung: Allow Principal: Service: - "cloudformation.Amazonaws.com" Aktion: - 'sts:AssumeRole' ManagedPolicyArns: - arn:aws:iam::aws:policy/AmazonS3FullAccess - arn:aws:iam::aws:policy/PowerUserAccess Tags: - Schlüssel: "Project" Wert: "test -blog" - Schlüssel: "Umgebung" Wert: "test" - Schlüssel: "createdBy" Wert: "Maureen Barasa" - Schlüssel: "Name" Wert: !Ref CFRole AmazonCloudWatchEventRole: Typ: 'AWS::IAM::Role' Eigenschaften: Beschreibung: Die CodeBuild Validate CF-Vorlagenrolle Rollenname: !Ref CWEventsRole AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effekt: Allow Principal: Service: - "events.Amazonaws.com" Aktion: - 'sts:AssumeRole' Policies: - PolicyName: root PolicyDocument: Version: 2012-10-17 Anweisung: - Effekt: Allow Action: - 'codepipeline:StartPipelineExecution' Ressource: !Join [, [ 'arn:aws:codepipeline:', !Ref 'AWS::Region', ':', !Ref 'AWS::AccountId', ':', !Ref DeployPipeline ] ] Tags: - Schlüssel: "Projekt" Wert: "test-blog" - Schlüssel: "Umgebung" Wert: "test" - Schlüssel: "createdBy" Wert: "Maureen Barasa" - Schlüssel: "Name" Wert: !Ref CWEventsRole AmazonCloudWatchEventRule: Typ: AWS::Events::Rule-Eigenschaften: EventPattern: source: - aws.codecommit detail-type: - 'CodeCommit Repository State Change'-Ressourcen: - arn:aws:codecommit:eu-central-1:429758582529:test-lint detail: event: - referenceCreated - referenceUpdated referenceType: - branch referenceName: - master-Ziele: - Arn: !Join [, [ 'arn:aws:codepipeline:', !Ref 'AWS::Region', ':', !Ref 'AWS::AccountId', ':', !Ref DeployPipeline ] ] RoleArn: !GetAtt AmazonCloudWatchEventRole.Arn-ID: codepipeline-DeployPipeline DeployPipeline: Typ: AWS::CodePipeline::Pipeline-Eigenschaften: RoleArn: !GetAtt CodePipelineRole.Arnname: !Ref PipelineName ArtifactStore: Ort: !Ref S3 Type: S3 Stages: - Name: Source Actions: - Name: SourceAction ActionTypeId: Kategorie: Source Owner: AWS Version: 1 Provider: CodeCommit OutputArtifacts: - Name: SourceArtifact Configuration: RepositoryName: test-lint BranchName: master PollForSourceChanges: false RunOrder: 1 - Name: Build Actions: - Name: BuildAction InputArtifacts: - Name: SourceArtifact ActionTypeId: Kategorie: Build Owner: AWS Version: 1 Anbieter: CodeBuild Configuration: ProjectName: !ImportValue BuildProject BatchEnabled: 'false' OutputArtifacts: [] RunOrder: 1 - Name: Deploy Actions: - Name: DeployAction InputArtifacts: - Name: SourceArtifact ActionTypeId: Kategorie: Deploy Owner: AWS Version: 1 Anbieter: CloudFormation Konfiguration: ActionMode: CREATE_UPDATE StackName : !Ref-Stack-Funktionen: CAPABILITY_IAM,CAPABILITY_NAMED_IAM RoleArn: !GetAtt CloudFormationRole.Arn TemplatePath: "SourceArtifact::ECR.yaml" RunOrder: 1 Tags: - Schlüssel: "Projekt" Wert: "test-blog" - Schlüssel: "Umgebung" Wert: "test" - Schlüssel: "createdBy" Wert: "Maureen Barasa" - Schlüssel: "Name" Wert : !Ref PipelineName

Die Vorlage beginnt mit der Bereitstellung eines S3-Buckets zum Hochladen unserer CodePipeline-Artefakte. Dann entstehen drei Rollen. Die von CodePipeline zu übernehmende CodePipeline-Rolle, die in der Bereitstellungsphase zu verwendende CloudFormation-Rolle und die CloudWatch-Ereignisserolle. Die CloudWatch-Ereignisrolle wird von der CloudWatch-Ereignisregel verwendet, um Änderungen im CodeCommit-Repository zu überwachen und den Start der Pipeline auszulösen.

Schließlich stellt die Vorlage die Pipeline bereit. Die Pipeline hat drei Stufen. Quelle, Build und Bereitstellung. Die Quellstufe lädt Code von CodeCommit . hoch. Die Build-Phase verwendet das Build-Projekt, um unsere CloudFormation-Vorlage zu validieren. Schließlich stellt die Bereitstellungsphase die Vorlage in CloudFormation bereit.

Hinweis: Der Benutzer sollte die Vorlage anpassen. Die Namen von Ressourcen, Eigenschaften und Tags sollten den spezifischen Anforderungen des Benutzers entsprechen.

Die CodePipeline

Wichtige Links

Andere AWS-Leitfäden:

Glückliches Bauen!!!

So ändern Sie ein bereits vorhandenes Administratorkonto in Windows 10
Wenn Sie daran denken, den administrativen Status eines Kontos zu ändern, aber nicht wissen, wie das geht, sind Sie hier genau richtig. In diesem Arti...
So ertönt die Feststelltaste unter Windows 10, wenn Sie sie drücken
Sind Sie genervt, die zu schlagen? Caps Lock immer wieder auf der Tastatur drücken, wenn Sie sehr schnell tippen? Sie müssen die gesamte Zeile aus dem...
So erstellen Sie eine Verknüpfung zum Übertragen von Dateien über Bluetooth in Windows 10
Wenn Sie häufig Bluetooth zum Übertragen von Dateien oder Ordnern in Windows 10 verwenden, verringert das Erstellen einer Verknüpfung zum Übertragen d...