

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 AWS CodeBuild avec Amazon Virtual Private Cloud
<a name="vpc-support"></a>

En règle générale, AWS CodeBuild impossible d'accéder aux ressources d'un VPC. Pour activer l'accès, vous devez fournir des informations de configuration supplémentaires spécifiques au VPC dans la configuration de votre CodeBuild projet. Cela inclut l'ID VPC, le sous-réseau VPC IDs et le groupe de sécurité VPC. IDs Les builds compatibles VPC peuvent ensuite accéder aux ressources à l'intérieur de votre VPC. Pour plus d'informations sur la configuration d'un VPC dans Amazon VPC, consultez le guide de l'utilisateur Amazon [VPC](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Introduction.html).

**Topics**
+ [Cas d’utilisation](#use-cases)
+ [Les meilleures pratiques pour VPCs](#best-practices-for-vpcs)
+ [Limites de VPCs](#vpc-limitations)
+ [Autorisez l'accès à Amazon VPC dans vos projets CodeBuild](enabling-vpc-access-in-projects.md)
+ [Résoudre les problèmes de configuration de votre VPC](troubleshooting-vpc.md)
+ [Utilisation de points de terminaison de VPC](use-vpc-endpoints-with-codebuild.md)
+ [Utilisation AWS CodeBuild avec un serveur proxy géré](run-codebuild-in-managed-proxy-server.md)
+ [Utilisation AWS CodeBuild avec un serveur proxy](use-proxy-server.md)
+ [CloudFormation Modèle VPC](cloudformation-vpc-template.md)

## Cas d’utilisation
<a name="use-cases"></a>

La connectivité VPC depuis les AWS CodeBuild builds permet de :
+ Exécutez des tests d'intégration depuis votre build par rapport aux données d'une base de données Amazon RDS isolée sur un sous-réseau privé.
+ Interrogez les données d'un ElastiCache cluster Amazon directement à partir de tests.
+ Interagissez avec des services Web internes hébergés sur Amazon EC2, Amazon ECS ou des services qui utilisent Elastic Load Balancing interne.
+ Récupérez des dépendances de référentiels d'artefact internes auto-hébergés, comme PyPI pour Python, Maven pour Java et npm pour Node.js.
+ Accédez aux objets d'un compartiment S3 configuré pour autoriser l'accès uniquement via un point de terminaison Amazon VPC.
+ Recherchez des services web externes qui nécessitent des adresses IP fixes par le biais de l'adresse IP Elastic de la passerelle NAT ou d'une instance NAT associée à votre ou vos sous-réseaux.

Vos générations peuvent accéder à n'importe quelle ressource qui est hébergée dans votre VPC.

## Les meilleures pratiques pour VPCs
<a name="best-practices-for-vpcs"></a>

Utilisez cette liste de contrôle lorsque vous configurez un VPC avec lequel vous souhaitez travailler. CodeBuild
+ Configurez votre VPC avec des sous-réseaux publics et privés, ainsi qu'une passerelle NAT. La passerelle NAT doit résider dans un sous-réseau public. Pour plus d'informations, consultez [VPC avec des sous-réseaux publics et privés (NAT)](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Scenario2.html) dans le *Amazon VPC Guide de l'utilisateur*.
**Important**  
Vous avez besoin d'une passerelle NAT ou d'une instance NAT à utiliser CodeBuild avec votre VPC afin de CodeBuild pouvoir atteindre les points de terminaison publics (par exemple, pour exécuter des commandes CLI lors de l'exécution de builds). Vous ne pouvez pas utiliser la passerelle Internet à la place d'une passerelle NAT ou d'une instance NAT car elle CodeBuild ne prend pas en charge l'attribution d'adresses IP élastiques aux interfaces réseau qu'elle crée, et l'attribution automatique d'une adresse IP publique n'est pas prise en charge par Amazon EC2 pour les interfaces réseau créées en dehors des lancements d'instances Amazon EC2. 
+ Incluez plusieurs zones de disponibilité avec votre VPC.
+ Assurez-vous qu'aucun trafic entrant (entrant) n'est autorisé à accéder à vos builds pour vos groupes de sécurité. CodeBuild n'a pas d'exigences spécifiques pour le trafic sortant, mais vous devez autoriser l'accès à toutes les ressources Internet requises pour votre build, comme GitHub Amazon S3.

  Pour de plus amples informations, veuillez consulter [Règles des groupes de sécurité](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#SecurityGroupRules) dans le *Guide de l'utilisateur Amazon VPC*. 
+ Configurez des sous-réseaux distincts pour vos générations.
+ Lorsque vous configurez vos CodeBuild projets pour accéder à votre VPC, choisissez des sous-réseaux privés uniquement. 

Pour plus d'informations sur la configuration d'un VPC dans Amazon VPC, consultez le guide de l'utilisateur Amazon [VPC](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Introduction.html).

Pour plus d'informations sur l'utilisation CloudFormation de la fonctionnalité VPC pour configurer un CodeBuild VPC, consultez le. [CloudFormation Modèle VPC](cloudformation-vpc-template.md)

## Limites de VPCs
<a name="vpc-limitations"></a>
+ La connectivité VPC depuis n' CodeBuild est pas prise en charge pour le partage. VPCs

# Autorisez l'accès à Amazon VPC dans vos projets CodeBuild
<a name="enabling-vpc-access-in-projects"></a>

Incluez ces paramètres dans la configuration de votre VPC :
+ Pour l'ID **VPC, choisissez l'ID** VPC qui utilise. CodeBuild 
+ Pour les **sous-réseaux**, choisissez un sous-réseau privé avec traduction NAT qui inclut ou possède des itinéraires vers les ressources utilisées par. CodeBuild
+ Pour les **groupes de sécurité**, choisissez les groupes de sécurité CodeBuild utilisés pour autoriser l'accès aux ressources du VPCs.



Pour utiliser la console afin de créer un projet de génération, consultez [Création d'un projet de génération (console)](create-project.md#create-project-console). Lorsque vous créez ou modifiez votre CodeBuild projet, dans **VPC, choisissez votre ID VPC**, vos sous-réseaux et vos groupes de sécurité. 



Pour utiliser le AWS CLI pour créer un projet de construction, voir[Création d'un projet de génération (AWS CLI)](create-project.md#create-project-cli). Si vous utilisez le AWS CLI with CodeBuild, le rôle de service utilisé CodeBuild pour interagir avec les services au nom de l'utilisateur IAM doit être associé à une politique. Pour plus d'informations, consultez [Autoriser CodeBuild l'accès aux AWS services requis pour créer une interface réseau VPC](auth-and-access-control-iam-identity-based-access-control.md#customer-managed-policies-example-create-vpc-network-interface).

L'*vpcConfig*objet doit inclure votre *vpcId**securityGroupIds*, et*subnets*.
+ *vpcId* : obligatoire. L'ID VPC qui CodeBuild utilise. Exécutez cette commande pour obtenir une liste de tous les Amazon VPC de votre IDs région :

  ```
  aws ec2 describe-vpcs
  ```
+ *subnets* : obligatoire. Le sous-réseau IDs qui inclut les ressources utilisées par CodeBuild. Exécutez cette commande pour obtenir les éléments suivants IDs :

  ```
  aws ec2 describe-subnets --filters "Name=vpc-id,Values=<vpc-id>" --region us-east-1
  ```
**Note**  
Remplacez `us-east-1` par votre région.
+ *securityGroupIds* : obligatoire. Le groupe de sécurité IDs utilisé par CodeBuild pour autoriser l'accès aux ressources du VPCs. Exécutez cette commande pour les obtenir IDs :

  ```
  aws ec2 describe-security-groups --filters "Name=vpc-id,Values=<vpc-id>" --region us-east-1
  ```
**Note**  
Remplacez `us-east-1` par votre région.

# Résoudre les problèmes de configuration de votre VPC
<a name="troubleshooting-vpc"></a>

Utilisez les informations affichées dans le message d'erreur pour vous aider à identifier, à diagnostiquer et à résoudre les problèmes.

Voici quelques instructions pour vous aider lors du dépannage d'une erreur VPC CodeBuild courante : `Build does not have internet connectivity. Please check subnet network configuration`. 

1. [Assurez-vous que votre passerelle Internet est attachée au VPC](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Internet_Gateway.html#Add_IGW_Attach_Gateway).

1. [Assurez-vous que la table de routage de votre sous-réseau public pointe vers la passerelle Internet](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Route_Tables.html#route-tables-internet-gateway).

1. [Assurez-vous que votre réseau ACLs autorise la circulation du trafic](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#SecurityGroupRules).

1. [Assurez-vous que vos groupes de sécurité autorisent la circulation du trafic](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#SecurityGroupRules).

1. [Dépannez votre passerelle NAT](https://docs.aws.amazon.com/vpc/latest/userguide/VPC-nat-gateway.html#nat-gateway-troubleshooting).

1. [Assurez-vous que la table de routage des sous-réseaux privés pointe vers la passerelle NAT](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Route_Tables.html#route-tables-nat).

1. Assurez-vous que le rôle de service utilisé CodeBuild pour interagir avec les services au nom de l'utilisateur IAM dispose des autorisations définies dans [cette politique](https://docs.aws.amazon.com/codebuild/latest/userguide/auth-and-access-control-iam-identity-based-access-control.html#customer-managed-policies-example-create-vpc-network-interface). Pour de plus amples informations, veuillez consulter [CodeBuild Autoriser l'interaction avec d'autres AWS services](setting-up-service-role.md). 

   S' CodeBuild il manque des autorisations, il se peut que vous receviez un message d'erreur indiquant,`Unexpected EC2 error: UnauthorizedOperation`. Cette erreur peut se produire s'il CodeBuild ne dispose pas des autorisations Amazon EC2 requises pour travailler avec un VPC.

# Utilisation de points de terminaison de VPC
<a name="use-vpc-endpoints-with-codebuild"></a>

Vous pouvez améliorer la sécurité de vos builds en les configurant de manière AWS CodeBuild à utiliser un point de terminaison VPC d'interface. Les points de terminaison de l'interface sont alimentés par PrivateLink une technologie que vous pouvez utiliser pour accéder en privé à Amazon EC2 CodeBuild et en utilisant des adresses IP privées. PrivateLink restreint tout le trafic réseau entre vos instances gérées et Amazon EC2 vers le réseau Amazon. CodeBuild (Les instances gérées n'ont pas accès à Internet). De même, vous n'avez pas besoin d'une passerelle Internet, d'un périphérique NAT ni d'une passerelle privée virtuelle. Il n'est pas obligatoire de configurer PrivateLink, mais c'est recommandé. [Pour plus d'informations sur les points PrivateLink de terminaison VPC, consultez Qu'est-ce que c'est ? AWS PrivateLink](https://docs.aws.amazon.com/vpc/latest/privatelink/what-is-privatelink.html) .

## Avant de créer des points de terminaison de VPC
<a name="vpc-endpoints-before-you-begin"></a>

 Avant de configurer les points de terminaison VPC pour AWS CodeBuild, tenez compte des restrictions et limitations suivantes. 

**Note**  
 Utilisez une [passerelle NAT](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_NAT_Instance.html) si vous souhaitez utiliser CodeBuild des AWS services qui ne prennent pas en charge les connexions Amazon VPC PrivateLink. 
+  Les points de terminaison VPC prennent en charge le DNS fourni par Amazon via Amazon Route 53 uniquement. Si vous souhaitez utiliser votre propre DNS, vous pouvez utiliser le transfert DNS conditionnel. Pour plus d’informations, consultez [Jeux d’options DHCP](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_DHCP_Options.html) dans le *Guide de l’utilisateur Amazon VPC*. 
+  Les points de terminaison de VPC ne prennent pas en charge les demandes inter-régionales pour le moment. Assurez-vous de créer votre point de terminaison dans la même AWS région que tous les compartiments S3 qui stockent les entrées et sorties de votre build. Vous pouvez utiliser la console Amazon S3 ou la [get-bucket-location](https://docs.aws.amazon.com/cli/latest/reference/s3api/get-bucket-location.html)commande pour trouver l'emplacement de votre compartiment. Utilisez un point de terminaison Amazon S3 spécifique à une région pour accéder à votre compartiment (par exemple,`<bucket-name>.s3-us-west-2.amazonaws.com`). Pour plus d'informations sur les points de terminaison spécifiques à une région pour Amazon S3, consultez [Amazon Simple Storage Service](https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region) dans le. *Référence générale d'Amazon Web Services* Si vous utilisez le AWS CLI pour envoyer des demandes à Amazon S3, définissez votre région par défaut sur la même région que celle dans laquelle votre compartiment a été créé, ou utilisez le `--region` paramètre dans vos demandes.

## Créez des points de terminaison VPC pour CodeBuild
<a name="creating-vpc-endpoints"></a>

Suivez les instructions indiquées dans [Création d'un point de terminaison d'interface](https://docs.aws.amazon.com/vpc/latest/userguide/vpce-interface.html#create-interface-endpoint) pour créer le point de terminaison `com.amazonaws.region.codebuild`. Il s'agit d'un point de terminaison VPC pour. AWS CodeBuild

![\[Configuration du point de terminaison du VPC.\]](http://docs.aws.amazon.com/fr_fr/codebuild/latest/userguide/images/vpc-endpoint.png)


 *region*représente l'identifiant de région d'une AWS région prise en charge par CodeBuild, par exemple `us-east-2` pour la région USA Est (Ohio). Pour obtenir la liste des AWS régions prises en charge, reportez-vous [CodeBuild](https://docs.aws.amazon.com/general/latest/gr/rande.html#codebuild_region)à la section *Référence AWS générale*. Le point de terminaison est prérempli avec la région que vous avez spécifiée lorsque vous vous êtes connecté AWS. Si vous changez de région, le point de terminaison du VPC est mis à jour en conséquence. 

## Créez une politique de point de terminaison VPC pour CodeBuild
<a name="creating-vpc-endpoint-policy"></a>

 Vous pouvez créer une politique pour les points de terminaison Amazon VPC AWS CodeBuild dans laquelle vous pouvez spécifier :
+ Le principal qui peut exécuter des actions.
+ Les actions qui peuvent être effectuées.
+ Les ressources qui peuvent avoir des actions exécutées sur elles. 

L'exemple de stratégie suivant spécifie que tous les mandataires peuvent uniquement lancer et afficher des générations pour le projet `project-name`. 

```
{
    "Statement": [
        {
            "Action": [
                "codebuild:ListBuildsForProject",
                "codebuild:StartBuild",
                "codebuild:BatchGetBuilds"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:codebuild:region-ID:account-ID:project/project-name",
            "Principal": "*"
        }
    ]
}
```

 Pour plus d’informations, consultez [Contrôle de l’accès aux services avec points de terminaison d’un VPC](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints-access.html) dans le *Guide de l’utilisateur Amazon VPC*. 

# Utilisation AWS CodeBuild avec un serveur proxy géré
<a name="run-codebuild-in-managed-proxy-server"></a>

 Pour exécuter des flottes de capacité AWS CodeBuild réservée sur un serveur proxy géré, vous devez configurer le serveur proxy pour autoriser ou refuser le trafic à destination et en provenance de sites externes à l'aide de règles de proxy. Notez que l'exécution de flottes de capacité réservée sur un serveur proxy géré n'est pas prise en charge pour VPC, Windows ou macOS.

**Important**  
Il existe des coûts supplémentaires basés sur la durée pendant laquelle une configuration proxy est présente dans la flotte. Pour plus d'informations, consultez la section [https://aws.amazon.com/codebuild/tarification/](https://aws.amazon.com/codebuild/pricing/).

**Topics**
+ [Configurer une configuration de proxy géré pour les flottes de capacité réservée](#run-codebuild-in-managed-proxy-server-configure)
+ [Gérez un parc à capacité CodeBuild réservée](#use-managed-server-run-acb-fleet)

## Configurer une configuration de proxy géré pour les flottes de capacité réservée
<a name="run-codebuild-in-managed-proxy-server-configure"></a>

 Pour configurer un serveur proxy géré pour votre parc de capacités réservées, vous devez activer cette fonctionnalité lors de la création de votre parc dans votre console ou à l'aide du AWS CLI. Vous devez définir plusieurs propriétés :

**Définir les configurations de proxy (facultatif)**  
Configurations de proxy qui appliquent un contrôle d'accès réseau à vos instances de capacité réservée.

**Comportement par défaut**  
Définit le comportement du trafic sortant.    
**Allow**  
Autorise le trafic sortant vers toutes les destinations par défaut.  
**Refuser**  
Refuse le trafic sortant vers toutes les destinations par défaut.

**Règles relatives au proxy**  
Spécifie les domaines de destination auxquels le contrôle d'accès réseau doit être restreint.

Pour définir les configurations de proxy dans votre console, consultez [Création d'un parc de capacités réservées](fleets.md#fleets.how-to) les instructions. Pour définir des configurations de proxy à l'aide du AWS CLI, vous pouvez le faire en modifiant la syntaxe JSON suivante et en enregistrant vos résultats :

```
"proxyConfiguration": {
    "defaultBehavior": "ALLOW_ALL" | "DENY_ALL",
    "orderedProxyRules": [
        {
            "type": "DOMAIN" | "IP",
            "effect": "ALLOW" | "DENY",
            "entities": [
                "destination"
            ]
        }
    ]
}
```

Votre fichier JSON peut ressembler à ce qui suit :

```
"proxyConfiguration": {
    "defaultBehavior": "DENY_ALL",
    "orderedProxyRules": [
        {
            "type": "DOMAIN",
            "effect": "ALLOW",
            "entities": [
                "github.com"
            ]
        }
    ]
}
```

## Gérez un parc à capacité CodeBuild réservée
<a name="use-managed-server-run-acb-fleet"></a>

 Lorsque vous exécutez des flottes de capacité AWS CodeBuild réservée avec votre serveur proxy géré, il CodeBuild définira automatiquement ses variables `HTTP_PROXY` et celles de `HTTPS_PROXY` l'environnement avec les adresses proxy gérées. Si votre logiciel de dépendance possède sa propre configuration et ne respecte pas les variables d'environnement, vous pouvez vous référer à ces valeurs et mettre à jour votre configuration logicielle dans vos commandes de génération afin d'acheminer correctement votre trafic de génération via le proxy géré. Pour plus d'informations, consultez [Créez un projet de construction dans AWS CodeBuild](create-project.md) et [Modifier les paramètres du projet de construction dans AWS CodeBuild](change-project.md).

# Utilisation AWS CodeBuild avec un serveur proxy
<a name="use-proxy-server"></a>

 Vous pouvez l'utiliser AWS CodeBuild avec un serveur proxy pour réguler le trafic HTTP et HTTPS à destination et en provenance d'Internet. Pour fonctionner CodeBuild avec un serveur proxy, vous devez installer un serveur proxy dans un sous-réseau public et CodeBuild dans un sous-réseau privé d'un VPC. 

Il existe deux principaux cas d'utilisation pour l'exécution CodeBuild sur un serveur proxy : 
+  Il élimine l'utilisation d'une passerelle NAT ou d'une instance NAT dans votre VPC. 
+  Il vous permet de spécifier les accès URLs auxquels les instances du serveur proxy peuvent accéder et URLs celles auxquelles le serveur proxy refuse l'accès.

 Vous pouvez utiliser CodeBuild deux types de serveurs proxy. Dans les deux cas, le serveur proxy s'exécute dans un sous-réseau public et CodeBuild dans un sous-réseau privé. 
+  **Proxy explicite** : si vous utilisez un serveur proxy explicite, vous devez configurer `NO_PROXY``HTTP_PROXY`, et les variables d'`HTTPS_PROXY`environnement CodeBuild au niveau du projet. Pour plus d’informations, consultez [Modifier les paramètres du projet de construction dans AWS CodeBuild](change-project.md) et [Créez un projet de construction dans AWS CodeBuild](create-project.md). 
+  **Proxy transparent** : si vous utilisez un serveur proxy transparent, aucune configuration spéciale n'est nécessaire. 

**Topics**
+ [Configuration des composants nécessaires à l'exécution CodeBuild sur un serveur proxy](use-proxy-server-transparent-components.md)
+ [Exécuter CodeBuild sur un serveur proxy explicite](run-codebuild-in-explicit-proxy-server.md)
+ [Exécuter CodeBuild sur un serveur proxy transparent](run-codebuild-in-transparent-proxy-server.md)
+ [Exécution d'un gestionnaire de package et d'autres outils sur un serveur proxy](use-proxy-server-tools.md)

# Configuration des composants nécessaires à l'exécution CodeBuild sur un serveur proxy
<a name="use-proxy-server-transparent-components"></a>

 Les composants suivants sont nécessaires pour fonctionner AWS CodeBuild sur un serveur proxy transparent ou explicite : 
+  Un VPC. 
+  Un sous-réseau public dans votre VPC pour le serveur proxy 
+  Un sous-réseau privé dans votre VPC pour CodeBuild 
+  Une passerelle Internet qui permet la communication entre le VPC et Internet. 

 Le schéma suivant illustre la manière dont les deux composants interagissent. 

![\[Le schéma montre comment les composants interagissent.\]](http://docs.aws.amazon.com/fr_fr/codebuild/latest/userguide/images/codebuild-proxy-transparent.png)


## Configuration d'un VPC, de sous-réseaux et d'une passerelle réseau
<a name="use-proxy-server-transparent-setup"></a>

 Les étapes suivantes sont requises pour fonctionner AWS CodeBuild sur un serveur proxy transparent ou explicite. 

1. Créez un VPC. Pour plus d'informations, consultez [Création d'un VPC](https://docs.aws.amazon.com/vpc/latest/userguide/working-with-vpcs.html#Create-VPC) dans le *Guide de l'utilisateur Amazon VPC*.

1. Créez deux sous-réseaux dans votre VPC. L'un des deux est un sous-réseau public, nommé `Public Subnet`, dans lequel le serveur proxy s'exécute. L'autre est un sous-réseau privé nommé `Private Subnet` dans lequel CodeBuild s'exécute. 

   Pour de plus amples informations, veuillez consulter [Création d'un sous-réseau dans votre VPC](https://docs.aws.amazon.com/vpc/latest/userguide/working-with-vpcs.html#AddaSubnet).

1.  Créez et attachez une passerelle Internet à votre VPC. Pour de plus amples informations, veuillez consulter [Création et attachement d'une passerelle Internet](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Internet_Gateway.html#Add_IGW_Attach_Gateway). 

1.  Ajoutez une règle à la table de routage par défaut qui achemine le trafic sortant à partir du VPC (0.0.0.0/0) vers la passerelle Internet. Pour de plus amples informations, veuillez consulter [Ajout et retrait de routes d'une table de routage](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Route_Tables.html#AddRemoveRoutes). 

1.  Ajoutez une règle au groupe de sécurité par défaut de votre VPC qui autorise le trafic SSH entrant (TCP 22) à partir de votre VPC (0.0.0.0/0). 

1.  Suivez les instructions de la section [Lancement d'une instance à l'aide de l'assistant de lancement d'instance](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/launching-instance.html) du *guide de l'utilisateur Amazon EC2* pour lancer une instance Amazon Linux. Lorsque vous exécutez l'assistant, choisissez les options suivantes : 
   +  Dans **Choisir un type d'instance**, choisissez une Amazon Linux Amazon Machine Image (AMI). 
   +  Dans **Subnet (Sous-réseau)**, choisissez le sous-réseau public que vous avez créé précédemment dans cette rubrique. Si vous avez utilisé le nom suggéré, il s'agit de **Public Subnet**. 
   +  Pour **Auto-assign Public IP (Attribuer automatiquement) l'adresse IP publique**, sélectionnez **(Enable) Activer**. 
   +  Sur la page **Configure Security Group (Configurer un groupe de sécurité)**, pour **Assign a security group (Affecter un groupe de sécurité)**, choisissez **Select an existing security group (Sélectionner un groupe de sécurité existant)**. Ensuite, choisissez le groupe de sécurité par défaut. 
   +  Après avoir choisir **Launch (Lancer)**, choisissez une paire de clés existante ou créez-en une. 

    Choisissez les paramètres par défaut pour toutes les autres options. 

1.  Une fois que votre instance EC2 est en cours d'exécution, désactivez les source/destination vérifications. Pour plus d'informations, consultez la section [Désactivation Source/Destination des contrôles](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_NAT_Instance.html#EIP_Disable_SrcDestCheck) dans le guide de l'*utilisateur Amazon VPC.* 

1.  Créez une table de routage dans votre VPC. Ajoutez une règle à la table de routage qui achemine le trafic destiné à Internet vers votre serveur proxy. Associez cette table de routage à votre sous-réseau privé. Cela est nécessaire pour que les demandes sortantes provenant des instances de votre sous-réseau privé, où CodeBuild s'exécute, soient toujours acheminées via le serveur proxy. 

## Installation et configuration d'un serveur proxy
<a name="use-proxy-server-squid-install"></a>

 Il existe de nombreux serveurs proxy parmi lesquels choisir. Un serveur proxy open source, Squid, est utilisé ici pour montrer comment AWS CodeBuild fonctionne un serveur proxy. Vous pouvez appliquer les mêmes concepts à d'autres serveurs proxy. 

 Pour installer Squid, utilisez un référentiel yum en exécutant les commandes suivantes : 

```
sudo yum update -y
sudo yum install -y squid
```

 Après avoir installé Squid, modifiez son fichier `squid.conf` en suivant les instructions plus loin dans cette rubrique. 

## Configuration de Squid pour le trafic HTTPS
<a name="use-proxy-server-squid-configure-https"></a>

 Pour HTTPS, le trafic HTTP est encapsulé dans une connexion à protocole TLS (Transport Layer Security, Sécurité de la couche transport). Squid utilise une fonctionnalité appelée [SslPeekAndSplice](https://wiki.squid-cache.org/Features/SslPeekAndSplice)pour récupérer l'indication du nom du serveur (SNI) à partir de l'initiation TLS qui contient l'hôte Internet demandé. Cette opération est requise pour que Squid ne soit pas obligé de déchiffrer le trafic HTTPS. Pour l'activer SslPeekAndSplice, Squid a besoin d'un certificat. Créez ce certificat à l'aide d'OpenSSL : 

```
sudo mkdir /etc/squid/ssl
cd /etc/squid/ssl
sudo openssl genrsa -out squid.key 2048
sudo openssl req -new -key squid.key -out squid.csr -subj "/C=XX/ST=XX/L=squid/O=squid/CN=squid"
sudo openssl x509 -req -days 3650 -in squid.csr -signkey squid.key -out squid.crt
sudo cat squid.key squid.crt | sudo tee squid.pem
```

**Note**  
 Pour HTTP, Squid ne nécessite aucune configuration. À partir de tous les messages de demande HTTP/1.1, il peut extraire le champ d'en-tête de l'hôte, qui spécifie l'hôte Internet demandé. 

# Exécuter CodeBuild sur un serveur proxy explicite
<a name="run-codebuild-in-explicit-proxy-server"></a>

 Pour fonctionner AWS CodeBuild sur un serveur proxy explicite, vous devez configurer le serveur proxy pour autoriser ou refuser le trafic vers et depuis des sites externes, puis configurer les variables d'`HTTPS_PROXY`environnement `HTTP_PROXY` et. 

**Topics**
+ [Configuration de Squid en tant que serveur proxy explicite](#use-proxy-server-explicit-squid-configure)
+ [Création d'un CodeBuild projet](#use-proxy-server-explicit-create-acb-project)
+ [Exemple de fichier `squid.conf` de serveur proxy explicite](#use-proxy-server-explicit-sample-squid-conf)

## Configuration de Squid en tant que serveur proxy explicite
<a name="use-proxy-server-explicit-squid-configure"></a>

 Pour configurer le serveur proxy Squid en tant que serveur explicite, vous devez apporter les modifications suivantes au fichier `/etc/squid/squid.conf` : 
+  Supprimez les règles de liste de contrôle d'accès (ACL) par défaut suivantes :. 

  ```
  acl localnet src 10.0.0.0/8     
  acl localnet src 172.16.0.0/12  
  acl localnet src 192.168.0.0/16 
  acl localnet src fc00::/7       
  acl localnet src fe80::/10
  ```

   Ajoutez les règles suivantes à la place des règles ACL par défaut que vous avez supprimées. La première ligne autorise les demandes à partir de votre VPC. Les deux lignes suivantes permettent à votre serveur proxy d'accéder à une destination URLs susceptible d'être utilisée par AWS CodeBuild. Modifiez l'expression régulière dans la dernière ligne pour spécifier des compartiments S3 ou un CodeCommit référentiel dans une AWS région. Par exemple :
  + Si votre source est Amazon S3, utilisez la commande **acl download\$1src dstdom\$1regex .\$1s3\$1.us-west-1\$1.amazonaws\$1.com** pour autoriser l'accès aux compartiments S3 de la `us-west-1` région.
  +  Si votre source l'est AWS CodeCommit, `git-codecommit.<your-region>.amazonaws.com` utilisez-le pour ajouter une AWS région à une liste autorisée. 

  ```
  acl localnet src 10.1.0.0/16 #Only allow requests from within the VPC
  acl allowed_sites dstdomain .github.com #Allows to download source from GitHub
  acl allowed_sites dstdomain .bitbucket.com #Allows to download source from Bitbucket
  acl download_src dstdom_regex .*\.amazonaws\.com #Allows to download source from Amazon S3 or CodeCommit
  ```
+  Remplacez `http_access allow localnet` par ce qui suit : 

  ```
  http_access allow localnet allowed_sites
  http_access allow localnet download_src
  ```
+ Si vous souhaitez que votre build charge des journaux et des artefacts, effectuez l'une des actions suivantes :

  1. Avant l'instruction `http_access deny all`, insérez les instructions suivantes. Ils permettent CodeBuild d'accéder CloudWatch à Amazon S3. L'accès à CloudWatch est requis pour CodeBuild créer des CloudWatch journaux. L'accès à Amazon S3 est requis pour le téléchargement d'artefacts et la mise en cache d'Amazon S3. 
     + 

       ```
       https_port 3130 cert=/etc/squid/ssl/squid.pem ssl-bump intercept
       acl SSL_port port 443
       http_access allow SSL_port
       acl allowed_https_sites ssl::server_name .amazonaws.com
       acl step1 at_step SslBump1
       acl step2 at_step SslBump2
       acl step3 at_step SslBump3
       ssl_bump peek step1 all
       ssl_bump peek step2 allowed_https_sites
       ssl_bump splice step3 allowed_https_sites
       ssl_bump terminate step2 all
       ```
     + Après avoir enregistré`squid.conf`, exécutez la commande suivante : 

       ```
       sudo iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 3130
       sudo service squid restart
       ```

  1.  Ajoutez `proxy` à votre fichier buildspec. Pour de plus amples informations, veuillez consulter [Syntaxe d'un fichier buildspec](build-spec-ref.md#build-spec-ref-syntax). 

     ```
     version: 0.2
     proxy:
       upload-artifacts: yes
       logs: yes
     phases:
       build:
         commands:
           - command
     ```

**Note**  
Si vous recevez un message d'erreur RequestError de temporisation, consultez[RequestError erreur de temporisation lors de l'exécution CodeBuild sur un serveur proxy](troubleshooting.md#code-request-timeout-error).

Pour plus d'informations, consultez [Exemple de fichier `squid.conf` de serveur proxy explicite](#use-proxy-server-explicit-sample-squid-conf) plus loin dans cette rubrique.

## Création d'un CodeBuild projet
<a name="use-proxy-server-explicit-create-acb-project"></a>

 Pour fonctionner AWS CodeBuild avec votre serveur proxy explicite, définissez ses variables `HTTP_PROXY` et ses variables d'`HTTPS_PROXY`environnement avec l'adresse IP privée de l'instance EC2 que vous avez créée pour votre serveur proxy et le port 3128 au niveau du projet. L'adresse IP privée se présente ainsi : `http://your-ec2-private-ip-address:3128`. Pour plus d’informations, consultez [Créez un projet de construction dans AWS CodeBuild](create-project.md) et [Modifier les paramètres du projet de construction dans AWS CodeBuild](change-project.md).

 Utilisez la commande suivante pour afficher le journal d'accès proxy Squid : 

```
sudo tail -f /var/log/squid/access.log
```

## Exemple de fichier `squid.conf` de serveur proxy explicite
<a name="use-proxy-server-explicit-sample-squid-conf"></a>

 L'exemple suivant présente un fichier `squid.conf` configuré pour un serveur proxy explicite. 

```
  acl localnet src 10.0.0.0/16 #Only allow requests from within the VPC
  # add all URLS to be whitelisted for download source and commands to be run in build environment
  acl allowed_sites dstdomain .github.com    #Allows to download source from github
  acl allowed_sites dstdomain .bitbucket.com #Allows to download source from bitbucket
  acl allowed_sites dstdomain ppa.launchpad.net #Allows to run apt-get in build environment
  acl download_src dstdom_regex .*\.amazonaws\.com #Allows to download source from S3 or CodeCommit
  acl SSL_ports port 443
  acl Safe_ports port 80		# http
  acl Safe_ports port 21		# ftp
  acl Safe_ports port 443		# https
  acl Safe_ports port 70		# gopher
  acl Safe_ports port 210		# wais
  acl Safe_ports port 1025-65535	# unregistered ports
  acl Safe_ports port 280		# http-mgmt
  acl Safe_ports port 488		# gss-http
  acl Safe_ports port 591		# filemaker
  acl Safe_ports port 777		# multiling http
  acl CONNECT method CONNECT
  #
  # Recommended minimum Access Permission configuration:
  #
  # Deny requests to certain unsafe ports
  http_access deny !Safe_ports
  # Deny CONNECT to other than secure SSL ports
  http_access deny CONNECT !SSL_ports
  # Only allow cachemgr access from localhost
  http_access allow localhost manager
  http_access deny manager
  # We strongly recommend the following be uncommented to protect innocent
  # web applications running on the proxy server who think the only
  # one who can access services on "localhost" is a local user
  #http_access deny to_localhost
  #
  # INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
  #
  # Example rule allowing access from your local networks.
  # Adapt localnet in the ACL section to list your (internal) IP networks
  # from where browsing should be allowed
  http_access allow localnet allowed_sites
  http_access allow localnet download_src
  http_access allow localhost
  # Add this for CodeBuild to access CWL end point, caching and upload artifacts S3 bucket end point
  https_port 3130 cert=/etc/squid/ssl/squid.pem ssl-bump intercept
  acl SSL_port port 443
  http_access allow SSL_port
  acl allowed_https_sites ssl::server_name .amazonaws.com
  acl step1 at_step SslBump1
  acl step2 at_step SslBump2
  acl step3 at_step SslBump3
  ssl_bump peek step1 all
  ssl_bump peek step2 allowed_https_sites
  ssl_bump splice step3 allowed_https_sites
  ssl_bump terminate step2 all
  # And finally deny all other access to this proxy
  http_access deny all
  # Squid normally listens to port 3128
  http_port 3128
  # Uncomment and adjust the following to add a disk cache directory.
  #cache_dir ufs /var/spool/squid 100 16 256
  # Leave coredumps in the first cache dir
  coredump_dir /var/spool/squid
  #
  # Add any of your own refresh_pattern entries above these.
  #
  refresh_pattern ^ftp:		1440	20%	10080
  refresh_pattern ^gopher:	1440	0%	1440
  refresh_pattern -i (/cgi-bin/|\?) 0	0%	0
  refresh_pattern .		0	20%	4320
```

# Exécuter CodeBuild sur un serveur proxy transparent
<a name="run-codebuild-in-transparent-proxy-server"></a>

 Pour fonctionner AWS CodeBuild sur un serveur proxy transparent, vous devez configurer le serveur proxy de manière à ce qu'il puisse accéder aux sites Web et aux domaines avec lesquels il interagit. 

**Topics**
+ [Configuration de Squid en tant que serveur proxy transparent](#use-proxy-server-transparent-squid-configure)
+ [Création d'un CodeBuild projet](#use-proxy-server-transparent-create-acb-project)

## Configuration de Squid en tant que serveur proxy transparent
<a name="use-proxy-server-transparent-squid-configure"></a>

 Pour configurer un serveur proxy en tant que serveur transparent, vous devez lui accorder l'accès aux domaines et aux sites Web auxquels vous souhaitez qu'il accède. Pour fonctionner AWS CodeBuild avec un serveur proxy transparent, vous devez lui accorder l'accès à`amazonaws.com`. Vous devez également autoriser l'accès à d'autres CodeBuild utilisations du site Web. Elles varient en fonction de la façon dont vous créez vos CodeBuild projets. Les sites Web relatifs à des référentiels tels que Bitbucket GitHub, Yum et Maven sont des exemples de sites Web. Pour accorder à Squid l'accès à des domaines et à des sites Web spécifiques, utilisez une commande similaire à la suivante pour mettre à jour le fichier `squid.conf`. Cet exemple de commande accorde l'accès à `amazonaws.com`, `github.com` et `bitbucket.com`. Vous pouvez modifier cet exemple pour donner accès à d'autres sites Web. 

```
cat | sudo tee /etc/squid/squid.conf ≪EOF
visible_hostname squid
#Handling HTTP requests
http_port 3129 intercept
acl allowed_http_sites dstdomain .amazonaws.com
#acl allowed_http_sites dstdomain domain_name [uncomment this line to add another domain]
http_access allow allowed_http_sites
#Handling HTTPS requests
https_port 3130 cert=/etc/squid/ssl/squid.pem ssl-bump intercept
acl SSL_port port 443
http_access allow SSL_port
acl allowed_https_sites ssl::server_name .amazonaws.com
acl allowed_https_sites ssl::server_name .github.com
acl allowed_https_sites ssl::server_name .bitbucket.com
#acl allowed_https_sites ssl::server_name [uncomment this line to add another website]
acl step1 at_step SslBump1
acl step2 at_step SslBump2
acl step3 at_step SslBump3
ssl_bump peek step1 all
ssl_bump peek step2 allowed_https_sites
ssl_bump splice step3 allowed_https_sites
ssl_bump terminate step2 all
http_access deny all
EOF
```

 Les demandes entrantes à partir des instances du sous-réseau privé doivent être redirigées vers les ports Squid. Squid écoute le trafic HTTP sur le port 3129 (au lieu de 80) et le trafic HTTPS sur le port 3130 (au lieu de 443). Utilisez la commande **iptables** pour acheminer le trafic : 

```
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3129
sudo iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 3130
sudo service iptables save
sudo service squid start
```

## Création d'un CodeBuild projet
<a name="use-proxy-server-transparent-create-acb-project"></a>

 Après avoir configuré votre serveur proxy, vous pouvez l'utiliser AWS CodeBuild dans un sous-réseau privé sans autre configuration. Chaque demande HTTP et HTTPS passe par le serveur proxy public. Utilisez la commande suivante pour afficher le journal d'accès proxy Squid : 

```
sudo tail -f /var/log/squid/access.log
```

# Exécution d'un gestionnaire de package et d'autres outils sur un serveur proxy
<a name="use-proxy-server-tools"></a>

Utilisez les procédures suivantes pour exécuter un gestionnaire de packages et d'autres outils sur un serveur proxy.

**Pour exécuter un outil, tel qu'un gestionnaire de packages, sur un serveur proxy**

1.  Pour inclure l'outil dans la liste d'autorisation de votre serveur proxy, ajoutez des instructions dans le fichier `squid.conf`. 

1.  Ajoutez une ligne à votre fichier buildspec qui pointe vers le point de terminaison privé de votre serveur proxy. 

 Les exemples suivants montrent comment procéder pour `apt-get`, `curl` et `maven`. Si vous utilisez un outil différent, les mêmes principes s'appliquent. Ajoutez-le à une liste d'autorisation dans le `squid.conf` fichier et ajoutez une commande à votre fichier buildspec pour identifier le point de CodeBuild terminaison de votre serveur proxy. 

**Exécution de `apt-get` sur un serveur proxy**

1. Ajoutez les instructions suivantes à votre fichier `squid.conf` pour ajouter `apt-get` à une liste d'autorisation sur votre serveur proxy. Les trois premières lignes permettent `apt-get` de fonctionner dans l'environnement de construction.

   ```
   acl allowed_sites dstdomain ppa.launchpad.net # Required for apt-get to run in the build environment
   acl apt_get dstdom_regex .*\.launchpad.net # Required for CodeBuild to run apt-get in the build environment
   acl apt_get dstdom_regex .*\.ubuntu.com    # Required for CodeBuild to run apt-get in the build environment
   http_access allow localnet allowed_sites
   http_access allow localnet apt_get
   ```

1. Ajoutez l'instruction suivante dans votre fichier buildspec afin que les commandes `apt-get` recherchent la configuration proxy dans `/etc/apt/apt.conf.d/00proxy`.

   ```
   echo 'Acquire::http::Proxy "http://<private-ip-of-proxy-server>:3128"; Acquire::https::Proxy "http://<private-ip-of-proxy-server>:3128"; Acquire::ftp::Proxy "http://<private-ip-of-proxy-server>:3128";' > /etc/apt/apt.conf.d/00proxy
   ```

**Exécution de `curl` sur un serveur proxy**

1.  Insérez ce qui suit dans votre fichier `squid.conf` pour ajouter `curl` à une liste d'autorisation dans votre environnement de génération. 

   ```
   acl allowed_sites dstdomain ppa.launchpad.net # Required to run apt-get in the build environment
   acl allowed_sites dstdomain google.com # Required for access to a webiste. This example uses www.google.com.
   http_access allow localnet allowed_sites
   http_access allow localnet apt_get
   ```

1.  Ajoutez l'instruction suivante dans votre fichier buildspec de sorte que `curl` utilise le serveur proxy privé pour accéder au site Web que vous avez ajouté à `squid.conf`. Dans cet exemple, le site Web est `google.com`. 

   ```
   curl -x <private-ip-of-proxy-server>:3128 https://www.google.com
   ```

**Exécution de `maven` sur un serveur proxy**

1.  Insérez ce qui suit dans votre fichier `squid.conf` pour ajouter `maven` à une liste d'autorisation dans votre environnement de génération. 

   ```
   acl allowed_sites dstdomain ppa.launchpad.net # Required to run apt-get in the build environment
   acl maven dstdom_regex .*\.maven.org # Allows access to the maven repository in the build environment
   http_access allow localnet allowed_sites
   http_access allow localnet maven
   ```

1. Ajoutez l'instruction suivante à votre fichier buildspec. 

   ```
   maven clean install -DproxySet=true -DproxyHost=<private-ip-of-proxy-server> -DproxyPort=3128
   ```

# CloudFormation Modèle VPC
<a name="cloudformation-vpc-template"></a>

CloudFormation vous permet de créer et de provisionner des déploiements d' AWS infrastructure de manière prévisible et répétée, en utilisant des fichiers modèles pour créer et supprimer un ensemble de ressources en une seule unité (une *pile*). Pour plus d’informations, consultez le [CloudFormation Guide de l’utilisateur ](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html).

Ce qui suit est un modèle CloudFormation YAML pour configurer un VPC à utiliser. AWS CodeBuild Ce fichier est également disponible dans le [fichier samples.zip](./samples/samples.zip).

```
Description:  This template deploys a VPC, with a pair of public and private subnets spread
  across two Availability Zones. It deploys an internet gateway, with a default
  route on the public subnets. It deploys a pair of NAT gateways (one in each AZ),
  and default routes for them in the private subnets.

Parameters:
  EnvironmentName:
    Description: An environment name that is prefixed to resource names
    Type: String

  VpcCIDR:
    Description: Please enter the IP range (CIDR notation) for this VPC
    Type: String
    Default: 10.192.0.0/16

  PublicSubnet1CIDR:
    Description: Please enter the IP range (CIDR notation) for the public subnet in the first Availability Zone
    Type: String
    Default: 10.192.10.0/24

  PublicSubnet2CIDR:
    Description: Please enter the IP range (CIDR notation) for the public subnet in the second Availability Zone
    Type: String
    Default: 10.192.11.0/24

  PrivateSubnet1CIDR:
    Description: Please enter the IP range (CIDR notation) for the private subnet in the first Availability Zone
    Type: String
    Default: 10.192.20.0/24

  PrivateSubnet2CIDR:
    Description: Please enter the IP range (CIDR notation) for the private subnet in the second Availability Zone
    Type: String
    Default: 10.192.21.0/24

Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !Ref VpcCIDR
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value: !Ref EnvironmentName

  InternetGateway:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
        - Key: Name
          Value: !Ref EnvironmentName

  InternetGatewayAttachment:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      InternetGatewayId: !Ref InternetGateway
      VpcId: !Ref VPC

  PublicSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      AvailabilityZone: !Select [ 0, !GetAZs '' ]
      CidrBlock: !Ref PublicSubnet1CIDR
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: !Sub ${EnvironmentName} Public Subnet (AZ1)

  PublicSubnet2:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      AvailabilityZone: !Select [ 1, !GetAZs  '' ]
      CidrBlock: !Ref PublicSubnet2CIDR
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: !Sub ${EnvironmentName} Public Subnet (AZ2)

  PrivateSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      AvailabilityZone: !Select [ 0, !GetAZs  '' ]
      CidrBlock: !Ref PrivateSubnet1CIDR
      MapPublicIpOnLaunch: false
      Tags:
        - Key: Name
          Value: !Sub ${EnvironmentName} Private Subnet (AZ1)

  PrivateSubnet2:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      AvailabilityZone: !Select [ 1, !GetAZs  '' ]
      CidrBlock: !Ref PrivateSubnet2CIDR
      MapPublicIpOnLaunch: false
      Tags:
        - Key: Name
          Value: !Sub ${EnvironmentName} Private Subnet (AZ2)

  NatGateway1EIP:
    Type: AWS::EC2::EIP
    DependsOn: InternetGatewayAttachment
    Properties:
      Domain: vpc

  NatGateway2EIP:
    Type: AWS::EC2::EIP
    DependsOn: InternetGatewayAttachment
    Properties:
      Domain: vpc

  NatGateway1:
    Type: AWS::EC2::NatGateway
    Properties:
      AllocationId: !GetAtt NatGateway1EIP.AllocationId
      SubnetId: !Ref PublicSubnet1

  NatGateway2:
    Type: AWS::EC2::NatGateway
    Properties:
      AllocationId: !GetAtt NatGateway2EIP.AllocationId
      SubnetId: !Ref PublicSubnet2

  PublicRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: !Sub ${EnvironmentName} Public Routes

  DefaultPublicRoute:
    Type: AWS::EC2::Route
    DependsOn: InternetGatewayAttachment
    Properties:
      RouteTableId: !Ref PublicRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway

  PublicSubnet1RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref PublicRouteTable
      SubnetId: !Ref PublicSubnet1

  PublicSubnet2RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref PublicRouteTable
      SubnetId: !Ref PublicSubnet2


  PrivateRouteTable1:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: !Sub ${EnvironmentName} Private Routes (AZ1)

  DefaultPrivateRoute1:
    Type: AWS::EC2::Route
    Properties:
      RouteTableId: !Ref PrivateRouteTable1
      DestinationCidrBlock: 0.0.0.0/0
      NatGatewayId: !Ref NatGateway1

  PrivateSubnet1RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref PrivateRouteTable1
      SubnetId: !Ref PrivateSubnet1

  PrivateRouteTable2:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: !Sub ${EnvironmentName} Private Routes (AZ2)

  DefaultPrivateRoute2:
    Type: AWS::EC2::Route
    Properties:
      RouteTableId: !Ref PrivateRouteTable2
      DestinationCidrBlock: 0.0.0.0/0
      NatGatewayId: !Ref NatGateway2

  PrivateSubnet2RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref PrivateRouteTable2
      SubnetId: !Ref PrivateSubnet2

  NoIngressSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: "no-ingress-sg"
      GroupDescription: "Security group with no ingress rule"
      VpcId: !Ref VPC

Outputs:
  VPC:
    Description: A reference to the created VPC
    Value: !Ref VPC

  PublicSubnets:
    Description: A list of the public subnets
    Value: !Join [ ",", [ !Ref PublicSubnet1, !Ref PublicSubnet2 ]]

  PrivateSubnets:
    Description: A list of the private subnets
    Value: !Join [ ",", [ !Ref PrivateSubnet1, !Ref PrivateSubnet2 ]]

  PublicSubnet1:
    Description: A reference to the public subnet in the 1st Availability Zone
    Value: !Ref PublicSubnet1

  PublicSubnet2:
    Description: A reference to the public subnet in the 2nd Availability Zone
    Value: !Ref PublicSubnet2

  PrivateSubnet1:
    Description: A reference to the private subnet in the 1st Availability Zone
    Value: !Ref PrivateSubnet1

  PrivateSubnet2:
    Description: A reference to the private subnet in the 2nd Availability Zone
    Value: !Ref PrivateSubnet2

  NoIngressSecurityGroup:
    Description: Security group with no ingress rule
    Value: !Ref NoIngressSecurityGroup
```