Exemplo do Amazon ECR para CodeBuild
Este exemplo usa uma imagem do Docker em um repositório de imagens do Amazon Elastic Container Registry (Amazon ECR) para compilar um exemplo do projeto Go.
Importante
Executar esta amostra pode resultar em cobranças em sua conta AWS. Isso inclui possíveis cobranças pelo AWS CodeBuild e por recursos da AWS e ações relacionadas ao Amazon S3, ao AWS KMS, ao CloudWatch Logs e ao Amazon ECR. Para obter mais informações, consulte Preços do CodeBuild
Execute o exemplo do Amazon ECR
Use as instruções a seguir para executar o exemplo do Amazon ECR para o CodeBuild.
Como executar este exemplo
-
Para criar e enviar por push uma imagem do Docker para o repositório de imagens no Amazon ECR, siga as etapas na seção Execute o exemplo “Publicar imagem do Docker no Amazon ECR” do Exemplo “Publicar imagem do Docker no Amazon ECR”.
-
Criar um projeto Go
-
Crie os arquivos conforme descrito nas seções Estrutura do projeto Go e Arquivos do projeto Go deste tópico e faça upload deles em um bucket de entrada do S3 ou em um repositório do AWS CodeCommit, do GitHub ou do Bitbucket.
Importante
Não faça upload de
, apenas dos arquivos dentro de(root directory name)
.(root directory name)
Se você estiver usando um bucket de entrada do S3, crie um arquivo ZIP que contenha os arquivos e envie-o para o bucket de entrada. Não adicione
ao arquivo ZIP, apenas aos arquivos dentro de(root directory name)
.(root directory name)
-
Crie um projeto de compilação, execute a compilação e exiba as respectivas informações.
Se você usar a AWS CLI para criar o projeto de compilação, a entrada em formato JSON para o comando
create-project
pode ser semelhante a esta. (Substitua os espaços reservados com seus próprios valores.){ "name": "sample-go-project", "source": { "type": "S3", "location": "codebuild-
region-ID
-account-ID
-input-bucket/GoSample
.zip" }, "artifacts": { "type": "S3", "location": "codebuild-region-ID
-account-ID
-output-bucket", "packaging": "ZIP", "name": "GoOutputArtifact
.zip" }, "environment": { "type": "LINUX_CONTAINER", "image": "aws/codebuild/standard:5.0", "computeType": "BUILD_GENERAL1_SMALL" }, "serviceRole": "arn:aws:iam::account-ID
:role/role-name
", "encryptionKey": "arn:aws:kms:region-ID
:account-ID
:key/key-ID
" } -
Para obter o artefato de saída de compilação, abra seu bucket de saída do S3.
-
Faça o download do arquivo
para seu computador ou instância local. Extraia o conteúdo do arquivo . Nesse conteúdo, procure o arquivoGoOutputArtifact
.ziphello
.
-
-
Se uma das seguintes situações for verdadeira, você deverá adicionar permissões ao repositório de imagens no Amazon ECR de modo que o AWS CodeBuild possa extrair a imagem do Docker para o ambiente de compilação.
-
O projeto usa credenciais do CodeBuild para extrair imagens do Amazon ECR. Isso é indicado por um valor de
CODEBUILD
no atributoimagePullCredentialsType
de seuProjectEnvironment
. -
O projeto usa uma imagem do Amazon ECR entre contas. Nesse caso, o projeto deverá usar o perfil de serviço para extrair imagens do Amazon ECR. Para habilitar esse comportamento, defina o atributo
imagePullCredentialsType
de seuProjectEnvironment
comoSERVICE_ROLE
.
Abra o console do Amazon ECR em https://console.aws.amazon.com/ecr/
-
Na lista de nomes de repositório, escolha o nome do repositório que você criou ou selecionou.
-
No painel de navegação, selecione Permissions (Permissões), Edit (Editar) e Add statement (Adicionar instrução).
-
Em Statement name (Nome da instrução), digite um identificador (por exemplo,
CodeBuildAccess
). -
Em Effect (Efeito), deixe a opção Allow (Permitir) selecionada. Isso indica que você deseja permitir o acesso a outra conta da AWS.
-
Em Principal, siga um dos seguintes procedimentos:
-
Se o projeto usa credenciais do CodeBuild para extrair uma imagem do Amazon ECR, em Entidade principal de serviço, insira
codebuild.amazonaws.com
. -
Se o projeto usa uma imagem do Amazon ECR entre contas, para IDs de conta da AWS, insira os IDs das contas da AWS às quais você deseja conceder acesso.
-
-
Ignore a lista All IAM entities.
-
Em Action (Ação), selecione as ações de extração apenas: ecr:GetDownloadUrlForLayer, ecr:BatchGetImage e ecr:BatchCheckLayerAvailability.
-
Em Condições, adicione o seguinte:
{ "StringEquals":{ "aws:SourceAccount":"
<AWS-account-ID>
", "aws:SourceArn":"arn:aws:codebuild:<region>
:<AWS-account-ID>
:project/<project-name>
" } } -
Escolha Salvar.
Essa política é exibida em Permissions (Permissões). O principal é a informação inserida em Principal na etapa 3 deste procedimento:
-
Se o projeto usa credenciais do CodeBuild para extrair uma imagem do Amazon ECR,
"codebuild.amazonaws.com"
aparecerá em Entidades principais de serviço. -
Se o projeto usa uma imagem do Amazon ECR entre contas, o ID da conta da AWS à qual você deseja conceder acesso aparece em IDs de contas da AWS.
A política de exemplo a seguir usa tanto credenciais do CodeBuild quanto uma imagem entre contas do Amazon ECR.
{ "Version":"2012-10-17", "Statement":[ { "Sid":"CodeBuildAccessPrincipal", "Effect":"Allow", "Principal":{ "Service":"codebuild.amazonaws.com" }, "Action":[ "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage", "ecr:BatchCheckLayerAvailability" ], "Condition":{ "StringEquals":{ "aws:SourceArn":"arn:aws:codebuild:
<region>
:<aws-account-id>
:project/<project-name>
", "aws:SourceAccount":"<aws-account-id>
" } } }, { "Sid":"CodeBuildAccessCrossAccount", "Effect":"Allow", "Principal":{ "AWS":"arn:aws:iam::<AWS-account-ID>
:root" }, "Action":[ "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage", "ecr:BatchCheckLayerAvailability" ] } ] }-
Se os projetos usarem credenciais do CodeBuild e você gostaria que os projetos do CodeBuild tivessem acesso aberto ao repositório do Amazon ECR, é possível omitir as chaves
Condition
e adicionar o exemplo de política a seguir.
{ "Version":"2012-10-17", "Statement":[ { "Sid":"CodeBuildAccessPrincipal", "Effect":"Allow", "Principal":{ "Service":"codebuild.amazonaws.com" }, "Action":[ "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage", "ecr:BatchCheckLayerAvailability" ] }, { "Sid":"CodeBuildAccessCrossAccount", "Effect":"Allow", "Principal":{ "AWS":"arn:aws:iam::
<AWS-account-ID>
:root" }, "Action":[ "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage", "ecr:BatchCheckLayerAvailability" ] } ] } -
-
-
Crie um projeto de compilação, execute a compilação e exiba suas informações.
Se você usar a AWS CLI para criar o projeto de compilação, a entrada em formato JSON para o comando
create-project
pode ser semelhante a esta. (Substitua os espaços reservados com seus próprios valores.){ "name": "amazon-ecr-sample-project", "source": { "type": "S3", "location": "codebuild-
region-ID
-account-ID
-input-bucket/GoSample
.zip" }, "artifacts": { "type": "S3", "location": "codebuild-region-ID
-account-ID
-output-bucket", "packaging": "ZIP", "name": "GoOutputArtifact
.zip" }, "environment": { "type": "LINUX_CONTAINER", "image": "account-ID
.dkr.ecr.region-ID
.amazonaws.com/your-Amazon-ECR-repo-name
:tag
", "computeType": "BUILD_GENERAL1_SMALL" }, "serviceRole": "arn:aws:iam::account-ID
:role/role-name
", "encryptionKey": "arn:aws:kms:region-ID
:account-ID
:key/key-ID
" } -
Para obter o artefato de saída de compilação, abra seu bucket de saída do S3.
-
Faça o download do arquivo
para seu computador ou instância local. Extraia o conteúdo do arquivoGoOutputArtifact
.zip
. Nesse conteúdo, procure o arquivoGoOutputArtifact
.ziphello
.
Estrutura do projeto Go
Essa amostra pressupõe esta estrutura de diretório.
(root directory name)
├── buildspec.yml
└── hello.go
Arquivos do projeto Go
Esta amostra usa estes arquivos.
buildspec.yml
(em
)(root directory
name)
version: 0.2 phases: install: runtime-versions: golang: 1.13 build: commands: - echo Build started on `date` - echo Compiling the Go code - go build hello.go post_build: commands: - echo Build completed on `date` artifacts: files: - hello
hello.go
(em
)(root directory
name)
package main import "fmt" func main() { fmt.Println("hello world") fmt.Println("1+1 =", 1+1) fmt.Println("7.0/3.0 =", 7.0/3.0) fmt.Println(true && false) fmt.Println(true || false) fmt.Println(!true) }