4. CodeBuildプロジェクトの作成 (handson-cli-codebuild-project)¶
作業の目的 [why]¶
CodeBuildプロジェクト"handson-cli-codebuild-project"を作成します。
完了条件/事前条件 [設計者用情報]
完了条件 [after]
主処理は、以下を満たしたときに成功したものとします。
- 完了条件1
- CodeBuildプロジェクト"handson-cli-codebuild-project"が存在する。
事前条件 [before]
主処理の実施は、以下の状態であることを前提とします。
- 事前条件1
- CodeBuildプロジェクト"handson-cli-codebuild-project"が存在しない。
- 事前条件2
- CodeBuild環境イメージ"aws/codebuild/python:3.6.5"が存在する。
- 事前条件3
- IAMロール"handson-cli-codebuild-role"が存在する。
- 事前条件4
- アーティファクト用S3バケット"handson-cli-artifacts-XXXXXXXXXXXX"が存在する。
- 事前条件5
- GitHubリポジトリが存在する。
作業対象 [what]¶
- CodeBuildサービス
標準時間(合計)¶
8分
パラメータ設定¶
パラメータ設定の標準時間: | 2分 |
---|
作業に必要なモノ・情報 [resource]¶
作業開始には、以下が全て揃っていることが必要です。
リソース1: CodeBuildプロジェクト名
- 作成するCodeBuildプロジェクトの名称です。
- 今回は"handson-cli-codebuild-project"とします。
リソース2: CodeBuildプロジェクトの詳細
- 作成するCodeBuildプロジェクトの説明です。
- 今回は"GITHUB"とします。
リソース3: 環境タイプ
- 作成するCodeBuildプロジェクトの環境タイプです。
- 今回は"LINUX_CONTAINER"とします。
リソース4: 環境イメージ
- 作成するCodeBuildプロジェクトの環境イメージです。
- 今回は"aws/codebuild/python:3.6.5"とします。
リソース5: 環境コンピュートタイプ名
- 作成するCodeBuildプロジェクトの環境コンピュートタイプです。
- 今回は"BUILD_GENERAL1_SMALL"とします。
リソース6: IAMロール名
- 作成するCodeBuildプロジェクトが利用するIAMロール名です。
- 今回は"handson-cli-codebuild-role"とします。
リソース7: アーティファクトタイプ
- 作成するCodeBuildプロジェクトのアーティファクトタイプです。
- 今回は"S3"とします。
リソース8: アーティファクト用S3バケット
- 作成するCodeBuildプロジェクトのアーティファクト用S3バケットです。
- 今回は"handson-cli-artifacts-XXXXXXXXXXXX"とします。
リソース9: ソースコードタイプ
- 作成するCodeBuildプロジェクトのソースコードタイプです。
- 今回は"GITHUB"とします。
リソース10: GitHubリポジトリ名
- 作成するCodeBuildプロジェクトのソースコード用GitHubリポジトリです。
- 今回は"<GitHubリポジトリURL>"とします。
パラメータの指定¶
作業に必要なパラメータを変数に格納をします。
0.1. CodeBuildプロジェクト名の指定¶
CodeBuildプロジェクト名を指定します。
変数の設定:
CODEB_PROJECT_NAME='handson-cli-codebuild-project'
0.8. アーティファクト用S3バケットの指定¶
アーティファクト用S3バケットを指定します。
変数の設定:
S3_BUCKET_PREFIX_ARTIFACTS='handson-cli-artifacts'
コマンド:
AWS_ID=$( \ aws sts get-caller-identity \ --query 'Account' \ --output text \ ) \ && echo ${AWS_ID}
結果(例):
XXXXXXXXXXXX
変数の設定:
S3_BUCKET_ARTIFACTS="${S3_BUCKET_PREFIX_ARTIFACTS}-${AWS_ID}" \ && echo ${S3_BUCKET_ARTIFACTS}
結果(例):
handson-cli-artifacts-XXXXXXXXXXXX
0.10. ソースコード用GitHubリポジトリの指定¶
ソースコード用GitHubリポジトリのURL(HTTPS)を指定します。
変数の設定:
GITHUB_REPOSITORY_URL='<GitHubリポジトリURL>'
パラメータの保存¶
設定されている変数の保存先となるファイル名を指定します。
変数の設定:
DIR_PARAMETER="${HOME}/tmp/parameter-handson-cli" FILE_PARAMETER="${DIR_PARAMETER}/$(date +%Y-%m-%d)-codebuild-project-create-expand-from_github-to_s3.env" \ && echo ${FILE_PARAMETER}
結果(例):
${HOME}/tmp/parameter-handson-cli/2019-04-30-codebuild-project-create-expand-from_github-to_s3.env
各変数に正しいパラメータ値が格納されていることを確認しながら保存します。
変数の確認:
cat << EOF > ${FILE_PARAMETER} # 0.0. AWS_DEFAULT_REGION:"ap-northeast-1" AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION}" # 0.1. CODEB_PROJECT_NAME:"handson-cli-codebuild-project" CODEB_PROJECT_NAME="${CODEB_PROJECT_NAME}" # 0.2. CODEB_PROJECT_DESC:"GITHUB" CODEB_PROJECT_DESC="${CODEB_PROJECT_DESC}" # 0.3. CODEB_ENV_TYPE:"LINUX_CONTAINER" CODEB_ENV_TYPE="${CODEB_ENV_TYPE}" # 0.4. CODEB_ENV_IMAGE:"aws/codebuild/python:3.6.5" CODEB_ENV_IMAGE="${CODEB_ENV_IMAGE}" # 0.5. CODEB_ENV_COMPUTE_TYPE:"BUILD_GENERAL1_SMALL" CODEB_ENV_COMPUTE_TYPE="${CODEB_ENV_COMPUTE_TYPE}" # 0.6. IAM_ROLE_NAME:"handson-cli-codebuild-role" IAM_ROLE_NAME="${IAM_ROLE_NAME}" # 0.7. CODEB_ARTIFACTS_TYPE:"S3" CODEB_ARTIFACTS_TYPE="${CODEB_ARTIFACTS_TYPE}" # 0.8. S3_BUCKET_ARTIFACTS:"handson-cli-artifacts-XXXXXXXXXXXX" S3_BUCKET_ARTIFACTS="${S3_BUCKET_ARTIFACTS}" # 0.9. CODEB_SOURCE_TYPE:"GITHUB" CODEB_SOURCE_TYPE="${CODEB_SOURCE_TYPE}" # 0.10. GITHUB_REPOSITORY_URL:"<GitHubリポジトリURL>" GITHUB_REPOSITORY_URL="${GITHUB_REPOSITORY_URL}" EOF cat ${FILE_PARAMETER}
下段の変数が入っていない、もしくは上段と同等の値が入っていない場合は、それぞれの手順番号に戻って変数の設定を行います。
タスクの実施¶
タスク標準時間: | 6分 |
---|
1. 前処理¶
1.1. 処理対象の状態確認¶
主処理の実施は、以下の状態であることを前提とします。
前提と異なることが判明した場合、直ちに処理を中止します。
事前条件1: CodeBuildプロジェクト"handson-cli-codebuild-project"が存在しない。
「CodeBuildプロジェクト"handson-cli-codebuild-project"が存在しない。」ことを確認します。
コマンド:
! aws codebuild list-projects \ --query "projects[]" \ | grep ${CODEB_PROJECT_NAME}
結果(例):
(出力なし)
事前条件2: CodeBuild環境イメージ"aws/codebuild/python:3.6.5"が存在する。
「CodeBuild環境イメージ"aws/codebuild/python:3.6.5"が存在する。」ことを確認します。
コマンド:
aws codebuild list-curated-environment-images \ --query "platforms[].languages[].images[?name == \`${CODEB_ENV_IMAGE}\`].name" \ --output text
結果(例):
aws/codebuild/python:3.6.5
事前条件3: IAMロール"handson-cli-codebuild-role"が存在する。
「IAMロール"handson-cli-codebuild-role"が存在する。」ことを確認します。
コマンド:
aws iam list-roles \ --query "Roles[?RoleName == \`${IAM_ROLE_NAME}\`].RoleName" \ --output text
結果(例):
handson-cli-codebuild-role
事前条件4: アーティファクト用S3バケット"handson-cli-artifacts-XXXXXXXXXXXX"が存在する。
「アーティファクト用S3バケット"handson-cli-artifacts-XXXXXXXXXXXX"が存在する。」ことを確認します。
コマンド:
aws s3api list-buckets \ --query "Buckets[?Name == \`${S3_BUCKET_ARTIFACTS}\`].Name" \ --output text
結果(例):
handson-cli-artifacts-XXXXXXXXXXXX
事前条件5: GitHubリポジトリが存在する。
「GitHubリポジトリが存在する。」ことを確認します。
1.2. 主処理に必要な情報の取得¶
environment文字列の生成
変数の設定:
STRING_CODEB_PROJECT_ENVIRONMENT="type=${CODEB_ENV_TYPE},image=${CODEB_ENV_IMAGE},computeType=${CODEB_ENV_COMPUTE_TYPE}" \ && echo ${STRING_CODEB_PROJECT_ENVIRONMENT}
結果(例):
type=LINUX_CONTAINER,image=aws/codebuild/python:3.6.5,computeType=BUILD_GENERAL1_SMALL
IAMロールのARN取得
IAMロールのARNを取得します。
コマンド:
IAM_ROLE_ARN=$( \ aws iam get-role \ --role-name ${IAM_ROLE_NAME} \ --query 'Role.Arn' \ --output text \ ) \ && echo ${IAM_ROLE_ARN}
結果(例):
arn:aws:iam::XXXXXXXXXXXX:role/handson-cli-codebuild-role
artifacts文字列の生成
変数の設定:
STRING_CODEB_PROJECT_ARTIFACTS="type=${CODEB_ARTIFACTS_TYPE},location=${S3_BUCKET_ARTIFACTS},name=${CODEB_PROJECT_NAME}.zip,packaging=ZIP" \ && echo ${STRING_CODEB_PROJECT_ARTIFACTS}
結果(例):
type=S3,location=handson-cli-artifacts-XXXXXXXXXXXX,name=handson-cli-codebuild-project.zip,packaging=ZIP
source文字列の生成
変数の設定:
STRING_CODEB_PROJECT_SOURCE="type=${CODEB_SOURCE_TYPE},location=${GITHUB_REPOSITORY_URL}" \ && echo ${STRING_CODEB_PROJECT_SOURCE}
結果(例):
type=GITHUB,location=<GitHubリポジトリURL>
2. 主処理¶
CodeBuildプロジェクトの作成¶
変数の確認:
cat << ETX # CODEB_PROJECT_NAME:"handson-cli-codebuild-project" CODEB_PROJECT_NAME="${CODEB_PROJECT_NAME}" # CODEB_PROJECT_DESC:"GITHUB" CODEB_PROJECT_DESC="${CODEB_PROJECT_DESC}" # STRING_CODEB_PROJECT_SOURCE:"type=GITHUB,location=<GitHubリポジトリURL>" STRING_CODEB_PROJECT_SOURCE="${STRING_CODEB_PROJECT_SOURCE}" # STRING_CODEB_PROJECT_ARTIFACTS:"type=S3,location=handson-cli-artifacts-XXXXXXXXXXXX,name=handson-cli-codebuild-project.zip,packaging=ZIP" STRING_CODEB_PROJECT_ARTIFACTS="${STRING_CODEB_PROJECT_ARTIFACTS}" # STRING_CODEB_PROJECT_ENVIRONMENT:"type=LINUX_CONTAINER,image=aws/codebuild/python:3.6.5,computeType=BUILD_GENERAL1_SMALL" STRING_CODEB_PROJECT_ENVIRONMENT="${STRING_CODEB_PROJECT_ENVIRONMENT}" # IAM_ROLE_ARN:"arn:aws:iam::XXXXXXXXXXXX:role/handson-cli-codebuild-role" IAM_ROLE_ARN="${IAM_ROLE_ARN}" ETX
コマンド:
aws codebuild create-project \ --name ${CODEB_PROJECT_NAME} \ --description "${CODEB_PROJECT_DESC}" \ --source ${STRING_CODEB_PROJECT_SOURCE} \ --artifacts ${STRING_CODEB_PROJECT_ARTIFACTS} \ --environment ${STRING_CODEB_PROJECT_ENVIRONMENT} \ --service-role ${IAM_ROLE_ARN}
結果(例):
{ "project": { "name": "handson-cli-codebuild-project", "arn": "arn:aws:codebuild:ap-northeast-1:XXXXXXXXXXXX:project/handson-cli-codebuild-project", "description": "GITHUB", "source": { "type": "GITHUB", "location": "<GitHubリポジトリURL>", "reportBuildStatus": false, "insecureSsl": false }, "artifacts": { "type": "S3", "location": "handson-cli-artifacts-XXXXXXXXXXXX", "namespaceType": "NONE", "name": "handson-cli-codebuild-project", "packaging": "ZIP", "encryptionDisabled": false }, "cache": { "type": "NO_CACHE" }, "environment": { "type": "LINUX_CONTAINER", "image": "aws/codebuild/python:3.6.5", "computeType": "BUILD_GENERAL1_SMALL", "environmentVariables": [], "privilegedMode": false }, "serviceRole": "arn:aws:iam::XXXXXXXXXXXX:role/handson-cli-codebuild-role", "timeoutInMinutes": 60, "queuedTimeoutInMinutes": 480, "encryptionKey": "arn:aws:kms:ap-northeast-1:XXXXXXXXXXXX:alias/aws/s3", "created": 15xxxxxxxx.000, "lastModified": 15xxxxxxxx.000, "badge": { "badgeEnabled": false } } }