

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Gunakan AWS CodeBuild dengan Amazon Virtual Private Cloud
<a name="vpc-support"></a>

Biasanya, AWS CodeBuild tidak dapat mengakses sumber daya dalam VPC. Untuk mengaktifkan akses, Anda harus memberikan informasi konfigurasi khusus VPC tambahan dalam konfigurasi proyek Anda CodeBuild . Ini termasuk ID VPC, subnet VPC, IDs dan grup keamanan VPC. IDs Build berkemampuan VPC kemudian dapat mengakses sumber daya di dalam VPC Anda. Untuk informasi selengkapnya tentang menyiapkan VPC di Amazon VPC, lihat Panduan Pengguna Amazon [VPC](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Introduction.html).

**Topics**
+ [

## Kasus penggunaan
](#use-cases)
+ [

## Praktik terbaik untuk VPCs
](#best-practices-for-vpcs)
+ [

## Keterbatasan VPCs
](#vpc-limitations)
+ [

# Izinkan akses Amazon VPC di proyek Anda CodeBuild
](enabling-vpc-access-in-projects.md)
+ [

# Memecahkan masalah pengaturan VPC Anda
](troubleshooting-vpc.md)
+ [

# Gunakan titik akhir VPC
](use-vpc-endpoints-with-codebuild.md)
+ [

# Gunakan AWS CodeBuild dengan server proxy terkelola
](run-codebuild-in-managed-proxy-server.md)
+ [

# Gunakan AWS CodeBuild dengan server proxy
](use-proxy-server.md)
+ [

# CloudFormation Templat VPC
](cloudformation-vpc-template.md)

## Kasus penggunaan
<a name="use-cases"></a>

Konektivitas VPC dari AWS CodeBuild build memungkinkan untuk:
+ Jalankan pengujian integrasi dari build Anda terhadap data dalam database Amazon RDS yang terisolasi di subnet pribadi.
+ Kueri data di ElastiCache klaster Amazon langsung dari pengujian.
+ Berinteraksi dengan layanan web internal yang dihosting di Amazon EC2, Amazon ECS, atau layanan yang menggunakan Elastic Load Balancing internal.
+ Ambil dependensi dari repositori artefak internal yang dihosting sendiri, seperti PyPI untuk Python, Maven untuk Java, dan npm untuk Node.js.
+ Akses objek dalam bucket S3 yang dikonfigurasi untuk mengizinkan akses melalui titik akhir VPC Amazon saja.
+ Kueri layanan web eksternal yang memerlukan alamat IP tetap melalui alamat IP Elastis dari gateway NAT atau instance NAT yang terkait dengan subnet Anda.

Build Anda dapat mengakses sumber daya apa pun yang di-host di VPC Anda.

## Praktik terbaik untuk VPCs
<a name="best-practices-for-vpcs"></a>

Gunakan daftar periksa ini saat Anda menyiapkan VPC untuk dikerjakan. CodeBuild
+ Siapkan VPC Anda dengan subnet publik dan pribadi, dan gateway NAT. Gateway NAT harus berada di subnet publik. Untuk informasi selengkapnya, lihat [VPC dengan subnet publik dan pribadi (NAT)](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Scenario2.html) di *Panduan Pengguna Amazon VPC*.
**penting**  
Anda memerlukan gateway NAT atau instance NAT untuk digunakan CodeBuild dengan VPC Anda sehingga CodeBuild dapat mencapai titik akhir publik (misalnya, untuk menjalankan perintah CLI saat menjalankan build). Anda tidak dapat menggunakan gateway internet alih-alih gateway NAT atau instans NAT karena CodeBuild tidak mendukung penetapan alamat IP Elastis ke antarmuka jaringan yang dibuatnya, dan menetapkan alamat IP publik secara otomatis tidak didukung oleh Amazon EC2 untuk antarmuka jaringan apa pun yang dibuat di luar peluncuran instans Amazon EC2. 
+ Sertakan beberapa Availability Zone dengan VPC Anda.
+ Pastikan grup keamanan Anda tidak memiliki lalu lintas masuk (ingress) yang diizinkan ke build Anda. CodeBuild tidak memiliki persyaratan khusus untuk lalu lintas keluar, tetapi Anda harus mengizinkan akses ke sumber daya Internet apa pun yang diperlukan untuk build Anda, seperti GitHub atau Amazon S3.

  Untuk informasi selengkapnya, lihat [Aturan grup keamanan](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#SecurityGroupRules) di *Panduan Pengguna Amazon VPC*. 
+ Siapkan subnet terpisah untuk build Anda.
+ Ketika Anda mengatur CodeBuild proyek Anda untuk mengakses VPC Anda, pilih subnet pribadi saja. 

Untuk informasi selengkapnya tentang menyiapkan VPC di Amazon VPC, lihat Panduan Pengguna Amazon [VPC](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Introduction.html).

Untuk informasi selengkapnya tentang penggunaan CloudFormation untuk mengonfigurasi VPC agar menggunakan fitur CodeBuild VPC, lihat. [CloudFormation Templat VPC](cloudformation-vpc-template.md)

## Keterbatasan VPCs
<a name="vpc-limitations"></a>
+ Konektivitas VPC dari tidak CodeBuild didukung untuk dibagikan. VPCs

# Izinkan akses Amazon VPC di proyek Anda CodeBuild
<a name="enabling-vpc-access-in-projects"></a>

Sertakan pengaturan ini dalam konfigurasi VPC Anda:
+ Untuk ID **VPC, pilih ID** VPC yang digunakan. CodeBuild 
+ Untuk **Subnet**, pilih subnet pribadi dengan terjemahan NAT yang mencakup atau memiliki rute ke sumber daya yang digunakan oleh. CodeBuild
+ Untuk **Grup Keamanan**, pilih grup keamanan yang CodeBuild digunakan untuk mengizinkan akses ke sumber daya di VPCs.



Untuk menggunakan konsol untuk membuat proyek build, lihat[Buat proyek build (konsol)](create-project.md#create-project-console). Saat Anda membuat atau mengubah CodeBuild proyek, di **VPC, pilih ID VPC**, subnet, dan grup keamanan Anda. 



Untuk menggunakan AWS CLI untuk membuat proyek build, lihat[Buat proyek build (AWS CLI)](create-project.md#create-project-cli). Jika Anda menggunakan AWS CLI with CodeBuild, peran layanan yang digunakan oleh CodeBuild untuk berinteraksi dengan layanan atas nama pengguna IAM harus memiliki kebijakan yang dilampirkan. Untuk informasi, lihat [Izinkan CodeBuild akses ke AWS layanan yang diperlukan untuk membuat antarmuka jaringan VPC](auth-and-access-control-iam-identity-based-access-control.md#customer-managed-policies-example-create-vpc-network-interface).

*vpcConfig*Objek harus mencakup Anda*vpcId*,*securityGroupIds*, dan*subnets*.
+ *vpcId*: Diperlukan. ID VPC yang CodeBuild menggunakan. Jalankan perintah ini untuk mendapatkan daftar semua VPC Amazon IDs di Wilayah Anda:

  ```
  aws ec2 describe-vpcs
  ```
+ *subnets*: Diperlukan. Subnet IDs yang mencakup sumber daya yang digunakan oleh CodeBuild. Jalankan perintah ini mendapatkan ini IDs:

  ```
  aws ec2 describe-subnets --filters "Name=vpc-id,Values=<vpc-id>" --region us-east-1
  ```
**catatan**  
Ganti `us-east-1` dengan Wilayah Anda.
+ *securityGroupIds*: Diperlukan. Kelompok keamanan yang IDs digunakan oleh CodeBuild untuk memungkinkan akses ke sumber daya di VPCs. Jalankan perintah ini untuk mendapatkan ini IDs:

  ```
  aws ec2 describe-security-groups --filters "Name=vpc-id,Values=<vpc-id>" --region us-east-1
  ```
**catatan**  
Ganti `us-east-1` dengan Wilayah Anda.

# Memecahkan masalah pengaturan VPC Anda
<a name="troubleshooting-vpc"></a>

Gunakan informasi yang muncul dalam pesan kesalahan untuk membantu Anda mengidentifikasi, mendiagnosis, dan mengatasi masalah.

Berikut ini adalah beberapa panduan untuk membantu Anda saat memecahkan masalah kesalahan CodeBuild VPC umum:. `Build does not have internet connectivity. Please check subnet network configuration` 

1. [Pastikan gateway internet Anda terpasang ke VPC](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Internet_Gateway.html#Add_IGW_Attach_Gateway).

1. [Pastikan bahwa tabel rute untuk subnet publik Anda menunjuk ke gateway internet](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Route_Tables.html#route-tables-internet-gateway).

1. [Pastikan jaringan Anda ACLs memungkinkan lalu lintas mengalir](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#SecurityGroupRules).

1. [Pastikan grup keamanan Anda mengizinkan lalu lintas mengalir](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#SecurityGroupRules).

1. [Memecahkan masalah gateway NAT Anda](https://docs.aws.amazon.com/vpc/latest/userguide/VPC-nat-gateway.html#nat-gateway-troubleshooting).

1. [Pastikan bahwa tabel rute untuk subnet pribadi menunjuk ke gateway NAT](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Route_Tables.html#route-tables-nat).

1. Pastikan bahwa peran layanan yang digunakan oleh CodeBuild untuk berinteraksi dengan layanan atas nama pengguna IAM memiliki izin dalam kebijakan [ini](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). Untuk informasi selengkapnya, lihat [Memungkinkan CodeBuild untuk berinteraksi dengan AWS layanan lain](setting-up-service-role.md). 

   Jika izin tidak CodeBuild ada, Anda mungkin menerima kesalahan yang mengatakan,`Unexpected EC2 error: UnauthorizedOperation`. Kesalahan ini dapat terjadi jika CodeBuild tidak memiliki izin Amazon EC2 yang diperlukan untuk bekerja dengan VPC.

# Gunakan titik akhir VPC
<a name="use-vpc-endpoints-with-codebuild"></a>

Anda dapat meningkatkan keamanan build Anda dengan mengonfigurasi AWS CodeBuild untuk menggunakan titik akhir VPC antarmuka. Endpoint antarmuka didukung oleh PrivateLink, teknologi yang dapat Anda gunakan untuk mengakses Amazon EC2 secara pribadi CodeBuild dan dengan menggunakan alamat IP pribadi. PrivateLink membatasi semua lalu lintas jaringan antara instans terkelola Anda CodeBuild, dan Amazon EC2 ke jaringan Amazon. (Instans terkelola tidak memiliki akses ke internet.) Selain itu, Anda tidak memerlukan gateway internet, perangkat NAT, atau gateway pribadi virtual. Anda tidak diwajibkan untuk mengonfigurasi PrivateLink, tetapi sebaiknya direkomendasikan. [Untuk informasi selengkapnya tentang PrivateLink dan titik akhir VPC, lihat Apa itu? AWS PrivateLink](https://docs.aws.amazon.com/vpc/latest/privatelink/what-is-privatelink.html) .

## Sebelum Anda membuat titik akhir VPC
<a name="vpc-endpoints-before-you-begin"></a>

 Sebelum Anda mengonfigurasi titik akhir VPC AWS CodeBuild, perhatikan batasan dan batasan berikut. 

**catatan**  
 Gunakan [gateway NAT](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_NAT_Instance.html) jika Anda ingin menggunakan CodeBuild dengan AWS layanan yang tidak mendukung koneksi Amazon PrivateLink VPC. 
+  Titik akhir VPC mendukung DNS yang disediakan Amazon hanya melalui Amazon Route 53. Jika Anda ingin menggunakan DNS Anda sendiri, Anda dapat menggunakan penerusan DNS bersyarat. Untuk informasi selengkapnya, lihat [Set opsi DHCP](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_DHCP_Options.html) dalam *Panduan Pengguna Amazon VPC*. 
+  Titik akhir VPC saat ini tidak mendukung permintaan lintas wilayah. Pastikan Anda membuat titik akhir di AWS Wilayah yang sama dengan bucket S3 mana pun yang menyimpan input dan output build Anda. Anda dapat menggunakan konsol Amazon S3 atau [get-bucket-location](https://docs.aws.amazon.com/cli/latest/reference/s3api/get-bucket-location.html)perintah untuk menemukan lokasi bucket Anda. Gunakan titik akhir Amazon S3 khusus Wilayah untuk mengakses bucket Anda (misalnya,). `<bucket-name>.s3-us-west-2.amazonaws.com` Untuk informasi selengkapnya tentang titik akhir khusus Wilayah untuk Amazon S3, lihat Layanan Penyimpanan [Sederhana Amazon di](https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region). *Referensi Umum Amazon Web* Jika Anda menggunakan AWS CLI untuk membuat permintaan ke Amazon S3, setel Wilayah default Anda ke Wilayah yang sama tempat bucket dibuat, atau gunakan `--region` parameter dalam permintaan Anda.

## Buat titik akhir VPC untuk CodeBuild
<a name="creating-vpc-endpoints"></a>

Ikuti petunjuk dalam [Membuat titik akhir antarmuka untuk membuat titik](https://docs.aws.amazon.com/vpc/latest/userguide/vpce-interface.html#create-interface-endpoint) akhir`com.amazonaws.region.codebuild`. Ini adalah titik akhir VPC untuk. AWS CodeBuild

![\[Konfigurasi titik akhir VPC.\]](http://docs.aws.amazon.com/id_id/codebuild/latest/userguide/images/vpc-endpoint.png)


 *region*mewakili pengenal wilayah untuk AWS Wilayah yang didukung oleh CodeBuild, seperti `us-east-2` untuk Wilayah Timur AS (Ohio). Untuk daftar AWS Wilayah yang didukung, lihat [CodeBuild](https://docs.aws.amazon.com/general/latest/gr/rande.html#codebuild_region)di *Referensi AWS Umum*. Titik akhir diisi sebelumnya dengan Wilayah yang Anda tentukan saat Anda masuk. AWS Jika Anda mengubah Wilayah Anda, titik akhir VPC diperbarui sesuai dengan itu. 

## Membuat kebijakan titik akhir VPC untuk CodeBuild
<a name="creating-vpc-endpoint-policy"></a>

 Anda dapat membuat kebijakan untuk titik akhir VPC Amazon yang dapat Anda tentukan: AWS CodeBuild 
+ Prinsipal yang dapat melakukan tindakan.
+ Tindakan yang dapat dilakukan.
+ Sumber daya yang dapat memiliki tindakan yang dilakukan pada mereka. 

Contoh kebijakan berikut menetapkan bahwa semua prinsipal hanya dapat memulai dan melihat build untuk proyek. `project-name` 

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

 Untuk informasi selengkapnya, lihat [Mengontrol Akses ke Layanan dengan titik akhir VPC](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints-access.html) dalam *Panduan Pengguna Amazon VPC*. 

# Gunakan AWS CodeBuild dengan server proxy terkelola
<a name="run-codebuild-in-managed-proxy-server"></a>

 Untuk menjalankan armada kapasitas AWS CodeBuild cadangan di server proxy terkelola, Anda harus mengonfigurasi server proxy untuk mengizinkan atau menolak lalu lintas ke dan dari situs eksternal menggunakan aturan proxy. Perhatikan bahwa menjalankan armada kapasitas cadangan di server proxy terkelola tidak didukung untuk VPC, Windows, atau macOS.

**penting**  
Ada biaya tambahan berdasarkan durasi konfigurasi proxy yang ada di armada. Untuk informasi lebih lanjut, lihat [https://aws.amazon.com/codebuild/harga/.](https://aws.amazon.com/codebuild/pricing/)

**Topics**
+ [

## Konfigurasikan konfigurasi proxy terkelola untuk armada kapasitas cadangan
](#run-codebuild-in-managed-proxy-server-configure)
+ [

## Jalankan armada kapasitas CodeBuild cadangan
](#use-managed-server-run-acb-fleet)

## Konfigurasikan konfigurasi proxy terkelola untuk armada kapasitas cadangan
<a name="run-codebuild-in-managed-proxy-server-configure"></a>

 Untuk mengonfigurasi server proxy terkelola untuk armada kapasitas cadangan Anda, Anda harus mengaktifkan fitur ini saat membuat armada di konsol atau menggunakan AWS CLI. Ada beberapa properti yang perlu Anda definisikan:

**Tentukan konfigurasi proxy - opsional**  
Konfigurasi proxy yang menerapkan kontrol akses jaringan ke instance kapasitas cadangan Anda.

**Perilaku default**  
Mendefinisikan perilaku lalu lintas keluar.    
**Izinkan**  
Mengizinkan lalu lintas keluar ke semua tujuan secara default.  
**Menyangkal**  
Menolak lalu lintas keluar ke semua tujuan secara default.

**Aturan proxy**  
Menentukan domain tujuan untuk membatasi kontrol akses jaringan ke.

Untuk menentukan konfigurasi proxy di konsol Anda, lihat [Buat armada kapasitas cadangan](fleets.md#fleets.how-to) petunjuknya. Untuk menentukan konfigurasi proxy menggunakan AWS CLI, Anda dapat melakukannya dengan memodifikasi sintaks JSON berikut dan menyimpan hasil Anda:

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

File JSON Anda mungkin terlihat mirip dengan yang berikut ini:

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

## Jalankan armada kapasitas CodeBuild cadangan
<a name="use-managed-server-run-acb-fleet"></a>

 Saat menjalankan armada kapasitas AWS CodeBuild cadangan dengan server proxy terkelola Anda, secara otomatis CodeBuild akan mengatur variabel `HTTP_PROXY` dan `HTTPS_PROXY` lingkungannya dengan alamat proxy terkelola. Jika perangkat lunak dependensi Anda memiliki konfigurasinya sendiri dan tidak mematuhi variabel lingkungan, Anda dapat merujuk ke nilai-nilai ini dan memperbarui konfigurasi perangkat lunak Anda dalam perintah build untuk merutekan lalu lintas build dengan benar melalui proxy terkelola. Lihat informasi yang lebih lengkap di [Buat proyek build di AWS CodeBuild](create-project.md) dan [Ubah pengaturan proyek build di AWS CodeBuild](change-project.md).

# Gunakan AWS CodeBuild dengan server proxy
<a name="use-proxy-server"></a>

 Anda dapat menggunakan AWS CodeBuild dengan server proxy untuk mengatur lalu lintas HTTP dan HTTPS ke dan dari internet. Untuk menjalankan CodeBuild dengan server proxy, Anda menginstal server proxy di subnet publik dan CodeBuild di subnet pribadi di VPC. 

Ada dua kasus penggunaan utama untuk berjalan CodeBuild di server proxy: 
+  Ini menghilangkan penggunaan gateway NAT atau instance NAT di VPC Anda. 
+  Ini memungkinkan Anda menentukan URLs bahwa instance di server proxy dapat mengakses dan URLs yang server proxy menolak akses.

 Anda dapat menggunakan CodeBuild dua jenis server proxy. Untuk keduanya, server proxy berjalan di subnet publik dan CodeBuild berjalan di subnet pribadi. 
+  **Proxy eksplisit**: Jika Anda menggunakan server proxy eksplisit, Anda harus mengkonfigurasi`NO_PROXY`,`HTTP_PROXY`, dan variabel `HTTPS_PROXY` lingkungan CodeBuild di tingkat proyek. Untuk informasi selengkapnya, lihat [Ubah pengaturan proyek build di AWS CodeBuild](change-project.md) dan [Buat proyek build di AWS CodeBuild](create-project.md). 
+  **Proxy transparan**: Jika Anda menggunakan server proxy transparan, tidak diperlukan konfigurasi khusus. 

**Topics**
+ [

# Menyiapkan komponen yang diperlukan untuk berjalan CodeBuild di server proxy
](use-proxy-server-transparent-components.md)
+ [

# Jalankan CodeBuild di server proxy eksplisit
](run-codebuild-in-explicit-proxy-server.md)
+ [

# Jalankan CodeBuild di server proxy transparan
](run-codebuild-in-transparent-proxy-server.md)
+ [

# Jalankan manajer paket dan alat lain di server proxy
](use-proxy-server-tools.md)

# Menyiapkan komponen yang diperlukan untuk berjalan CodeBuild di server proxy
<a name="use-proxy-server-transparent-components"></a>

 Anda memerlukan komponen ini untuk berjalan AWS CodeBuild di server proxy transparan atau eksplisit: 
+  SEBUAH VPC. 
+  Satu subnet publik di VPC Anda untuk server proxy. 
+  Satu subnet pribadi di CodeBuild VPC Anda untuk. 
+  Gateway internet yang memungkinkan komunikasi antara VPC dan internet. 

 Diagram berikut menunjukkan bagaimana komponen berinteraksi. 

![\[Diagram menunjukkan bagaimana komponen berinteraksi.\]](http://docs.aws.amazon.com/id_id/codebuild/latest/userguide/images/codebuild-proxy-transparent.png)


## Siapkan VPC, subnet, dan gateway jaringan
<a name="use-proxy-server-transparent-setup"></a>

 Langkah-langkah berikut diperlukan untuk berjalan AWS CodeBuild di server proxy transparan atau eksplisit. 

1. Buat sebuah VPC. Untuk selengkapnya, lihat [Membuat VPC](https://docs.aws.amazon.com/vpc/latest/userguide/working-with-vpcs.html#Create-VPC) di Panduan Pengguna Amazon *VPC*.

1. Buat dua subnet di VPC Anda. Salah satunya adalah subnet publik bernama `Public Subnet` di mana server proxy Anda berjalan. Yang lainnya adalah subnet pribadi bernama `Private Subnet` di mana CodeBuild berjalan. 

   Untuk selengkapnya, lihat [Membuat subnet di VPC Anda](https://docs.aws.amazon.com/vpc/latest/userguide/working-with-vpcs.html#AddaSubnet).

1.  Buat dan lampirkan gateway internet ke VPC Anda. Untuk informasi selengkapnya, lihat [Membuat dan melampirkan gateway internet](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Internet_Gateway.html#Add_IGW_Attach_Gateway). 

1.  Tambahkan aturan ke tabel rute default yang merutekan lalu lintas keluar dari VPC (0.0.0.0/0) ke gateway internet. Untuk selengkapnya, lihat [Menambahkan dan menghapus rute dari tabel rute](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Route_Tables.html#AddRemoveRoutes). 

1.  Tambahkan aturan ke grup keamanan default VPC Anda yang memungkinkan masuknya lalu lintas SSH (TCP 22) dari VPC Anda (0.0.0.0/0). 

1.  Ikuti petunjuk dalam [Meluncurkan instans menggunakan wizard instans peluncuran](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/launching-instance.html) di *Panduan Pengguna Amazon EC2* untuk meluncurkan instans Amazon Linux. Saat Anda menjalankan wizard, pilih opsi berikut: 
   +  Di **Pilih Jenis Instance**, pilih Amazon Linux Amazon Machine Image (AMI). 
   +  Di **Subnet**, pilih subnet publik yang Anda buat sebelumnya dalam topik ini. Jika Anda menggunakan nama yang disarankan, itu adalah **Public Subnet**. 
   +  **Di **Auto-assign IP Publik**, pilih Aktifkan.** 
   +  Pada halaman **Konfigurasi Grup Keamanan**, untuk **Menetapkan grup keamanan**, **pilih Pilih grup keamanan yang ada**. Selanjutnya, pilih grup keamanan default. 
   +  Setelah Anda memilih **Launch**, pilih key pair yang ada atau buat. 

    Pilih pengaturan default untuk semua opsi lainnya. 

1.  Setelah instans EC2 Anda berjalan, nonaktifkan source/destination pemeriksaan. Untuk selengkapnya, lihat [Menonaktifkan Source/Destination pemeriksaan](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_NAT_Instance.html#EIP_Disable_SrcDestCheck) di Panduan Pengguna Amazon *VPC*. 

1.  Buat tabel rute di VPC Anda. Tambahkan aturan ke tabel rute yang merutekan lalu lintas yang ditujukan untuk internet ke server proxy Anda. Kaitkan tabel rute ini dengan subnet pribadi Anda. Ini diperlukan agar permintaan keluar dari instance di subnet pribadi Anda, tempat CodeBuild dijalankan, selalu dirutekan melalui server proxy. 

## Instal dan konfigurasikan server proxy
<a name="use-proxy-server-squid-install"></a>

 Ada banyak server proxy yang dapat dipilih. Server proxy sumber terbuka, Squid, digunakan di sini untuk menunjukkan bagaimana AWS CodeBuild berjalan di server proxy. Anda dapat menerapkan konsep yang sama ke server proxy lainnya. 

 Untuk menginstal Squid, gunakan repo yum dengan menjalankan perintah berikut: 

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

 Setelah Anda menginstal Squid, edit `squid.conf` filenya menggunakan instruksi nanti dalam topik ini. 

## Konfigurasikan Squid untuk lalu lintas HTTPS
<a name="use-proxy-server-squid-configure-https"></a>

 Untuk HTTPS, lalu lintas HTTP dienkapsulasi dalam koneksi Transport Layer Security (TLS). Squid menggunakan fitur yang dipanggil [SslPeekAndSplice](https://wiki.squid-cache.org/Features/SslPeekAndSplice)untuk mengambil Server Name Indication (SNI) dari inisiasi TLS yang berisi host internet yang diminta. Ini diperlukan agar Squid tidak perlu menghapus enkripsi lalu lintas HTTPS. Untuk mengaktifkan SslPeekAndSplice, Squid memerlukan sertifikat. Buat sertifikat ini menggunakan 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
```

**catatan**  
 Untuk HTTP, Squid tidak memerlukan konfigurasi. Dari semua pesan permintaan HTTP/1.1, dapat mengambil bidang header host, yang menentukan host internet yang diminta. 

# Jalankan CodeBuild di server proxy eksplisit
<a name="run-codebuild-in-explicit-proxy-server"></a>

 Untuk berjalan AWS CodeBuild di server proxy eksplisit, Anda harus mengkonfigurasi server proxy untuk mengizinkan atau menolak lalu lintas ke dan dari situs eksternal, dan kemudian mengkonfigurasi variabel `HTTP_PROXY` dan `HTTPS_PROXY` lingkungan. 

**Topics**
+ [

## Konfigurasikan Squid sebagai server proxy eksplisit
](#use-proxy-server-explicit-squid-configure)
+ [

## Buat CodeBuild proyek
](#use-proxy-server-explicit-create-acb-project)
+ [

## File contoh `squid.conf` server proxy eksplisit
](#use-proxy-server-explicit-sample-squid-conf)

## Konfigurasikan Squid sebagai server proxy eksplisit
<a name="use-proxy-server-explicit-squid-configure"></a>

 Untuk mengonfigurasi server proxy Squid menjadi eksplisit, Anda harus melakukan modifikasi berikut pada file-nya`/etc/squid/squid.conf`: 
+  Hapus aturan daftar kontrol akses default (ACL) berikut. 

  ```
  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
  ```

   Tambahkan berikut ini sebagai pengganti aturan ACL default yang Anda hapus. Baris pertama memungkinkan permintaan dari VPC Anda. Dua baris berikutnya memberikan akses server proxy Anda ke tujuan URLs yang mungkin digunakan oleh AWS CodeBuild. Edit ekspresi reguler di baris terakhir untuk menentukan bucket S3 atau CodeCommit repositori di Wilayah. AWS Contoh:
  + Jika sumber Anda adalah Amazon S3, gunakan perintah **acl download\$1src dstdom\$1regex .\$1s3\$1.us-west-1\$1.amazonaws\$1.com** untuk memberikan akses ke bucket S3 di Wilayah. `us-west-1`
  +  Jika sumbernya AWS CodeCommit, gunakan `git-codecommit.<your-region>.amazonaws.com` untuk menambahkan AWS Wilayah ke daftar izin. 

  ```
  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
  ```
+  Ganti `http_access allow localnet` dengan yang berikut ini: 

  ```
  http_access allow localnet allowed_sites
  http_access allow localnet download_src
  ```
+ Jika Anda ingin build Anda mengunggah log dan artefak, lakukan salah satu hal berikut:

  1. Sebelum `http_access deny all` pernyataan itu, masukkan pernyataan berikut. Mereka memungkinkan CodeBuild untuk mengakses CloudWatch dan Amazon S3. Akses ke CloudWatch diperlukan agar CodeBuild dapat membuat CloudWatch log. Akses ke Amazon S3 diperlukan untuk mengunggah artefak dan caching 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
       ```
     + Setelah Anda menyimpan`squid.conf`, jalankan perintah berikut: 

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

  1.  Tambahkan `proxy` ke file buildspec Anda. Untuk informasi selengkapnya, lihat [Sintaks Buildspec](build-spec-ref.md#build-spec-ref-syntax). 

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

**catatan**  
Jika Anda menerima kesalahan RequestError batas waktu, lihat[RequestError kesalahan batas waktu saat berjalan CodeBuild di server proxy](troubleshooting.md#code-request-timeout-error).

Untuk informasi selengkapnya, lihat [File contoh `squid.conf` server proxy eksplisit](#use-proxy-server-explicit-sample-squid-conf) dalam topik ini.

## Buat CodeBuild proyek
<a name="use-proxy-server-explicit-create-acb-project"></a>

 Untuk menjalankan AWS CodeBuild dengan server proxy eksplisit Anda, atur variabel `HTTP_PROXY` dan `HTTPS_PROXY` lingkungannya dengan alamat IP pribadi dari instans EC2 yang Anda buat untuk server proxy dan port 3128 di tingkat proyek. Alamat IP pribadi terlihat seperti`http://your-ec2-private-ip-address:3128`. Untuk informasi selengkapnya, lihat [Buat proyek build di AWS CodeBuild](create-project.md) dan [Ubah pengaturan proyek build di AWS CodeBuild](change-project.md).

 Gunakan perintah berikut untuk melihat log akses proxy Squid: 

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

## File contoh `squid.conf` server proxy eksplisit
<a name="use-proxy-server-explicit-sample-squid-conf"></a>

 Berikut ini adalah contoh `squid.conf` file yang dikonfigurasi untuk server proxy eksplisit. 

```
  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
```

# Jalankan CodeBuild di server proxy transparan
<a name="run-codebuild-in-transparent-proxy-server"></a>

 Untuk berjalan AWS CodeBuild di server proxy transparan, Anda harus mengonfigurasi server proxy dengan akses ke situs web dan domain yang berinteraksi dengannya. 

**Topics**
+ [

## Konfigurasikan Squid sebagai server proxy transparan
](#use-proxy-server-transparent-squid-configure)
+ [

## Buat CodeBuild proyek
](#use-proxy-server-transparent-create-acb-project)

## Konfigurasikan Squid sebagai server proxy transparan
<a name="use-proxy-server-transparent-squid-configure"></a>

 Untuk mengonfigurasi server proxy agar transparan, Anda harus memberinya akses ke domain dan situs web yang ingin Anda akses. Untuk menjalankan AWS CodeBuild dengan server proxy transparan, Anda harus memberinya akses ke`amazonaws.com`. Anda juga harus memberikan akses ke CodeBuild penggunaan situs web lain. Ini bervariasi, tergantung pada bagaimana Anda membuat CodeBuild proyek Anda. Contoh situs web adalah untuk repositori seperti GitHub, Bitbucket, Yum, dan Maven. Untuk memberikan Squid akses ke domain dan situs web tertentu, gunakan perintah yang mirip dengan berikut ini untuk memperbarui file. `squid.conf` Perintah sampel ini memberikan akses ke`amazonaws.com`,`github.com`, dan`bitbucket.com`. Anda dapat mengedit sampel ini untuk memberikan akses ke situs web lain. 

```
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
```

 Permintaan masuk dari instance di subnet pribadi harus dialihkan ke port Squid. Squid mendengarkan pada port 3129 untuk lalu lintas HTTP (bukan 80) dan 3130 untuk lalu lintas HTTPS (bukan 443). Gunakan **iptables** perintah untuk merutekan lalu lintas: 

```
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
```

## Buat CodeBuild proyek
<a name="use-proxy-server-transparent-create-acb-project"></a>

 Setelah Anda mengkonfigurasi server proxy Anda, Anda dapat menggunakannya dengan AWS CodeBuild subnet pribadi tanpa konfigurasi lebih lanjut. Setiap permintaan HTTP dan HTTPS melewati server proxy publik. Gunakan perintah berikut untuk melihat log akses proxy Squid: 

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

# Jalankan manajer paket dan alat lain di server proxy
<a name="use-proxy-server-tools"></a>

Gunakan prosedur berikut untuk menjalankan manajer paket dan alat lain di server proxy.

**Untuk menjalankan alat, seperti manajer paket, di server proxy**

1.  Tambahkan alat ke daftar izinkan di server proxy Anda dengan menambahkan pernyataan ke `squid.conf` file Anda. 

1.  Tambahkan baris ke file buildspec Anda yang mengarah ke titik akhir pribadi server proxy Anda. 

 Contoh-contoh berikut menunjukkan bagaimana melakukan ini untuk`apt-get`,`curl`, dan`maven`. Jika Anda menggunakan alat yang berbeda, prinsip yang sama berlaku. Tambahkan ke daftar izinkan dalam `squid.conf` file dan tambahkan perintah ke file buildspec Anda untuk CodeBuild mengetahui titik akhir server proxy Anda. 

**Untuk berjalan `apt-get` di server proxy**

1. Tambahkan pernyataan berikut ke `squid.conf` file Anda untuk ditambahkan `apt-get` ke daftar izinkan di server proxy Anda. Tiga baris pertama memungkinkan `apt-get` untuk berjalan di lingkungan build.

   ```
   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. Tambahkan pernyataan berikut di file buildspec Anda sehingga `apt-get` perintah mencari konfigurasi proxy di. `/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
   ```

**Untuk berjalan `curl` di server proxy**

1.  Tambahkan berikut ini ke `squid.conf` file Anda untuk ditambahkan `curl` ke daftar izinkan di lingkungan build Anda. 

   ```
   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.  Tambahkan pernyataan berikut dalam file buildspec Anda sehingga `curl` gunakan server proxy pribadi untuk mengakses situs web yang Anda tambahkan ke file. `squid.conf` Dalam contoh ini, situs web adalah`google.com`. 

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

**Untuk berjalan `maven` di server proxy**

1.  Tambahkan berikut ini ke `squid.conf` file Anda untuk ditambahkan `maven` ke daftar izinkan di lingkungan build Anda. 

   ```
   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. Tambahkan pernyataan berikut ke file buildspec Anda. 

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

# CloudFormation Templat VPC
<a name="cloudformation-vpc-template"></a>

CloudFormation *memungkinkan Anda untuk membuat dan menyediakan penyebaran AWS infrastruktur yang dapat diprediksi dan berulang kali, dengan menggunakan file template untuk membuat dan menghapus kumpulan sumber daya bersama-sama sebagai satu unit (tumpukan).* Untuk informasi selengkapnya, lihat [Panduan Pengguna CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html).

Berikut ini adalah template CloudFormation YAMAL untuk mengkonfigurasi VPC yang akan digunakan. AWS CodeBuild File ini juga tersedia di [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
```