---
title: "AWS ECR Pull-Through Cache with Pulumi"
description: "a Pulumi program that creates ECR repositories with pull-through cache rules for Docker Hub and Google Container Registry."
url: "https://www.pulumi.com/dev/examples/aws-ts-ecr-cache/"
image: "https://www.pulumi.com/assets/og/dev/examples/aws-ts-ecr-cache.png"
---

# AWS ECR Pull-Through Cache with Pulumi

a Pulumi program that creates ECR repositories with pull-through cache rules for Docker Hub and Google Container Registry.

- Source on GitHub: https://github.com/pulumi/examples/tree/master/aws-ts-ecr-cache

## Get started with this example

This example lives in the [pulumi/examples](https://github.com/pulumi/examples/tree/master/aws-ts-ecr-cache) repo. Pull down just this directory to follow along:

```bash
git clone --filter=blob:none --sparse https://github.com/pulumi/examples pulumi-examples
git -C pulumi-examples sparse-checkout set aws-ts-ecr-cache
cd pulumi-examples/aws-ts-ecr-cache
```

This Pulumi project creates AWS Elastic Container Registry (ECR) repositories with pull-through cache rules for Docker Hub, GitHub Container Registry, and GitLab Container Registry. It also sets up AWS Secrets Manager secrets to store credentials for Docker Hub, GitHub, and GitLab.

## Prerequisites

- [Pulumi CLI](https://www.pulumi.com/docs/get-started/install/)
- [Node.js](https://nodejs.org/)
- [Yarn](https://yarnpkg.com/)
- AWS account and credentials configured

## Project Structure

- `index.ts`: The main Pulumi program that defines the infrastructure.
- `Pulumi.yaml`: The Pulumi project configuration file.
- `tsconfig.json`: TypeScript configuration file.
- `package.json`: Node.js project configuration file.
- `.gitignore`: Git ignore file.

## Setup

1. Install dependencies:

    ```sh
    yarn install
    ```

2. Configure Pulumi stack:

    ```sh
    pulumi config set aws:region <your-aws-region>
    ```

   ### Docker Hub

    > **Note**: To get your Docker Hub access token, log in to Docker Hub, navigate to [Account Settings](https://hub.docker.com/settings/security), and create a new access token.

    ```sh
    pulumi config set dockerHubUsername <your-docker-hub-username>
    pulumi config set --secret dockerHubAccessToken <your-docker-hub-access-token>
    ```

   ### GitHub

    > **Note**: To get your GitHub access token, log in to GitHub, navigate to [Developer settings](https://github.com/settings/tokens), and create a new personal access token with the `read:packages` scope.

    ```sh
    pulumi config set gitHubUsername <your-github-username>
    pulumi config set --secret gitHubAccessToken <your-github-access-token>
    ```

   ### GitLab

    > **Note**: To get your GitLab access token, log in to GitLab, navigate to [Access Tokens](https://gitlab.com/-/profile/personal_access_tokens), and create a new personal access token with the `read_registry` scope.

    ```sh
    pulumi config set gitLabUsername <your-gitlab-username>
    pulumi config set --secret gitLabAccessToken <your-gitlab-access-token>
    ```

3. Deploy the stack:

    ```sh
    pulumi up
    ```

## Resources Created

- **ECR Repositories**:
  - `pullThroughCacheECR`: ECR repository for pull-through cache.
  
- **Pull-Through Cache Rules**:
  - `dockerHubCacheRule`: Pull-through cache rule for Docker Hub (if `dockerHubUsername` is set).
  - `githubCacheRule`: Pull-through cache rule for GitHub Container Registry (if `gitHubUsername` is set).
  - `gitLabCacheRule`: Pull-through cache rule for GitLab Container Registry (if `gitLabUsername` is set).

- **Secrets Manager Secrets**:
  - `ecrPullThroughCacheDockerHubSecret`: Secret for Docker Hub credentials (if `dockerHubUsername` is set).
  - `ecrPullThroughCacheGitHubSecret`: Secret for GitHub credentials (if `gitHubUsername` is set).
  - `ecrPullThroughCacheGitLabSecret`: Secret for GitLab credentials (if `gitLabUsername` is set).

## Outputs

- `pullThroughCacheECRRepositoryUrl`: URL of the ECR repository.
- `ecrRepositoryPrefixes`: Prefixes for the ECR repositories.

## Cleanup

To remove all resources created by this project:

```sh
pulumi destroy
```
