web-dev-qa-db-ja.com

AWS codebuildの環境変数をbuildspec.ymlに渡す方法

Gatsbyサイトのルートディレクトリにあるbuildspec.ymlファイルに次のコマンドがあります。

version: 0.2

phases:
  install:
    commands:
      - npm i npm@latest -g
      - npm install --global gatsby-cli
      - npm install
      - pip install --upgrade pip
      - pip install --upgrade awscli
  build:
    commands:
      - gatsby build
  post_build:
    commands:
      - aws s3 sync public/ s3://stagging

Stagginとproductionの2つの環境があります。ここでsyncコマンドを自動化して、ある種の変数を使用してコードビルドを行うときに環境を変更できる方法はありますか?たぶん、コマンドライン経由で環境名を渡すことができます。

6
Acoustic Mike

コードビルドを作成するときに、環境変数を渡すことができます。

{
  "name": "sample-docker-project",
  "source": {
    "type": "S3",
    "location": "codebuild-region-ID-account-ID-input-bucket/DockerSample.Zip"
  },
  "artifacts": {
    "type": "NO_ARTIFACTS"
  },
  "environment": {
    "type": "LINUX_CONTAINER",
    "image": "aws/codebuild/docker:17.09.0",
    "computeType": "BUILD_GENERAL1_SMALL",
    "environmentVariables": [
      {
        "name": "AWS_DEFAULT_REGION",
        "value": "region-ID"
      },
      {
        "name": "AWS_ACCOUNT_ID",
        "value": "account-ID"
      },
      {
        "name": "IMAGE_REPO_NAME",
        "value": "Amazon-ECR-repo-name"
      },
      {
        "name": "IMAGE_TAG",
        "value": "latest"
      }
    ]
  },
  "serviceRole": "arn:aws:iam::account-ID:role/role-name",
  "encryptionKey": "arn:aws:kms:region-ID:account-ID:key/key-ID"
}

Buildspec.ymlでは、$ IMAGE_REPO_NAMEで通常の環境変数のようにそれらを参照できます。

version: 0.2

phases:
  pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      - $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION)
  build:
    commands:
      - echo Build started on `date`
      - echo Building the Docker image...          
      - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG .
      - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG      
  post_build:
    commands:
      - echo Build completed on `date`
      - echo Pushing the Docker image...
      - docker Push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG

できないことは、1つのコードビルドのみを作成し、スクリプトのように変数を渡すことです。そのため、2つのコードビルドを作成する必要がありますが、1つのbuildspec.ymlです。

詳細はこちら: https://docs.aws.Amazon.com/codebuild/latest/userguide/sample-docker.html

8
Koe

別のアプローチは、必要なすべての設定変数でスクリプトとYAMLを準備することです。

スクリプトファイルyaml_to_envvars.sh(ここから変更 https://stackoverflow.com/a/21189044/2275126 ):

#!/bin/bash

prefix=$2
s='[[:space:]]*' w='[a-zA-Z0-9_]*' fs=$(echo @|tr @ '\034')
sed -ne "s|^\($s\):|\1|" \
     -e "s|^\($s\)\($w\)$s:$s[\"']\(.*\)[\"']$s\$|\1$fs\2$fs\3|p" \
     -e "s|^\($s\)\($w\)$s:$s\(.*\)$s\$|\1$fs\2$fs\3|p"  $1 |
awk -F$fs '{
   indent = length($1)/2;
   vname[indent] = $2;
   for (i in vname) {if (i > indent) {delete vname[i]}}
   if (length($3) > 0) {
      vn=""; for (i=0; i<indent; i++) {vn=(vn)(vname[i])("_")}
      printf("conf_%s%s%s=\"%s\"\n", "'$prefix'",vn, $2, $3);
   }
}'

YAMLファイルsettings.yml

common:
  key1: value1
dev:
  key2: value2
test:
  key3: value3

そして、pre_buildセクションcommandsで次を実行します:

- chmod u+x yaml_to_envvars.sh
- ./yaml_to_envvars.sh settings.yml > variables.env
- |-
   for NEWVAR in $(cat variables.env); do
       export $NEWVAR
   done

次に、buildspec内で次の変数を使用できます。

$ echo $conf_common_key1
value1
$ echo $conf_dev_key2
value2
$ echo $conf_test_key3
value3
0
jotacor