Blog

Bereitstellen einer gehosteten S3-Anwendung mit CodePipeline

Joris Conijn

Aktualisiert Oktober 15, 2025
3 Minuten

Vor einiger Zeit habe ich geschrieben, wie Sie Ihre eigene einseitige Anwendung auf S3 hosten können. Aber wie bekommen Sie Ihre Anwendung in den S3-Bucket? Hier gibt es mehrere Möglichkeiten: Sie könnten sie von Hand hochladen. Aber wir wissen beide, dass das nicht die richtige Lösung ist. Nein, wir wollen diesen Prozess automatisieren! In diesem Blogbeitrag zeige ich Ihnen, wie Sie dies mit AWS CodePipeline automatisieren können.

Die Pipeline

AWS Codepipeline verwendet verschiedene Phasen. Ich verwende häufig die Phasen Source, Build und Deploy. In einigen Fällen unterteile ich die Bereitstellungsphase in eine Entwicklungs-, Test-, Abnahme- und Produktionsbereitstellung (auch bekannt als DTAP). Wenn Sie mehr darüber wissen möchten, wie Sie dies einrichten können, lesen Sie meinen Blog zum Erstellen von Anwendungen mit Pipelines. Letztendlich liegt es aber an Ihnen und daran, was für Ihren Anwendungsfall sinnvoll ist.

Wenn Sie Ihre Infrastruktur mit CloudFormation bereitstellen . Sie können die Ausgaben innerhalb der CodePipeline verwenden. Eine andere Möglichkeit ist die Verwendung einer Namenskonvention. Ich verwende gerne die Outputs, denn so müssen Sie nicht im Voraus einen Namen festlegen. Das macht es robuster, wenn Sie Snippets wiederverwenden oder Ihre Infrastruktur mehr als einmal bereitstellen.

Outputs:
  ApplicationBucketName:
    Value: !Ref ApplicationBucket

Als nächstes müssen Sie einen Namespace für die Aktion definieren, die Ihre Infrastruktur bereitstellt.

- Name: ExecuteChangeSet
  Region: eu-west-1
  RunOrder: 2
  RoleArn: !Sub arn:aws:iam::${DevelopmentAccountId}:role/cross-account-role
  Namespace: DevelopmentVariables
  ActionTypeId:
      Category: Deploy
      Owner: AWS
      Provider: CloudFormation
      Version: "1"
  Configuration:
      ActionMode: CHANGE_SET_EXECUTE
      RoleArn: !Sub arn:aws:iam::${DevelopmentAccountId}:role/cloudformation-execution-role
      StackName: !Sub ${ProjectName}-development
      ChangeSetName: !Sub ${ProjectName}-development-ChangeSet

Standardmäßig lädt CodePipeline die Ausgaben im angegebenen Namespace. In diesem Beispiel ist das DevelopmentVariables, so dass die ApplicationBucketName als verfügbar ist: #{DevelopmentVariables.ApplicationBucketName}.

Auf S3 bereitstellen

AWS bietet eine S3 Deploy Aktion, mit der Sie ein Artefakt in Ihrer Pipeline in S3 bereitstellen können. Sie können dieses Artefakt in einem CodeBuild-Projekt erstellen oder das Quell-Artefakt verwenden.

Ich verwende eine kontoübergreifende Bereitstellungsstrategie. Aus diesem Grund muss ich meiner kontoübergreifenden Rolle erlauben, Uploads in die S3-Buckets zuzulassen. Hierfür verwende ich eine BucketPolicy:

- Sid: AllowPipelineToUpload
  Effect: Allow
  Action: s3:PutObject
  Principal:
    AWS: !Sub arn:aws:iam::${AWS::AccountId}:role/cross-account-role
  Resource: !Sub ${ApplicationBucket.Arn}/*

Beachten Sie, dass sich die Rolle und der Bucket im selben Konto befinden. Die Pipeline befindet sich in meinem Build/Deployment-Konto. In der Pipeline müssen wir also den Upload auf S3 konfigurieren:

- Name: Ireland-Uploadapplication
  Region: eu-west-1
  RunOrder: 3
  RoleArn: !Sub arn:aws:iam::${DevelopmentAccountId}:role/cross-account-role
  InputArtifacts:
    - Name: application
  ActionTypeId:
    Category: Deploy
    Owner: AWS
    Provider: S3
    Version: "1"
  Configuration:
    BucketName: "#{DevelopmentVariables.ApplicationBucketName}"
    Extract: true
    CacheControl: max-age=0, no-cache, no-store, must-revalidate

In diesem Beispiel verwende ich mein Artefakt namens Anwendung und extrahiere den Inhalt in den S3-Bucket. Es wird die Rolle annehmen, die wir als angeben, um den Upload durchzuführen. Ich werde auch die CacheControl einstellen, damit CloudFront weiß, dass es die neuen Inhalte bereitstellen muss.

Fazit

Mit der Aktion S3 Deploy können Sie Ihre Inhalte ganz einfach in einen S3-Bucket hochladen. Damit entfällt die Notwendigkeit, ein CodeBuild-Projekt zum Hochladen der Inhalte zu verwenden. Dies reduziert die Kosten und die Komplexität, da Sie kein zusätzliches CodeBuild-Projekt pflegen müssen.

Verfasst von

Joris Conijn

Joris is the AWS Practise CTO of the Xebia Cloud service line and has been working with the AWS cloud since 2009 and focussing on building event-driven architectures. While working with the cloud from (almost) the start, he has seen most of the services being launched. Joris strongly believes in automation and infrastructure as code and is open to learning new things and experimenting with them because that is the way to learn and grow.

Contact

Let’s discuss how we can support your journey.