4. CodePipelineパイプラインドキュメントの作成 (handson-cli-pipeline)

作業の目的 [why]

CodePipelineパイプライン"handson-cli-pipeline"を作成します。

完了条件/事前条件 [設計者用情報]

完了条件 [after]

主処理は、以下を満たしたときに成功したものとします。

完了条件1
CodePipelineパイプライン定義ファイル"${HOME}/tmp/conf-handson-cli/handson-cli-pipeline.json"が存在する。

事前条件 [before]

主処理の実施は、以下の状態であることを前提とします。

事前条件1
CodePipelineパイプライン定義ファイル用ディレクトリ"${HOME}/tmp/conf-handson-cli"が存在する。
事前条件2
CodePipelineパイプライン定義ファイル"${HOME}/tmp/conf-handson-cli/handson-cli-pipeline.json"が存在しない。
事前条件3
S3バケット"handson-cli-artifacts-XXXXXXXXXXXX"が存在する。
事前条件4
CodeCommitリポジトリ"handson-cli-repository"が存在する。
事前条件5
Gitブランチ"develop"が存在する。
事前条件6
S3バケット"handson-cli-website-XXXXXXXXXXXX"が存在する。
事前条件7
IAMロール"AWSCodePipelineServiceRole-role"が存在する。

作業対象 [what]

  • CodePipelineサービス

標準時間(合計)

8分

パラメータ設定

パラメータ設定の標準時間:2分

作業に必要なモノ・情報 [resource]

作業開始には、以下が全て揃っていることが必要です。

リソース1: パイプライン定義ファイル用ディレクトリ

  • 今回は"${HOME}/tmp/conf-handson-cli"をパイプライン定義ファイル用ディレクトリとします。

ディレクトリが存在することを確認します。

コマンド:

ls -d ${HOME}/tmp/conf-handson-cli

結果(例:存在する場合):

${HOME}/tmp/conf-handson-cli

存在しない場合は作成します。

コマンド:

mkdir -p ${HOME}/tmp/conf-handson-cli

リソース2: CodePipelineパイプライン名

  • 作成するCodePipelineパイプラインの名称です。
  • 今回は"handson-cli-pipeline"とします。

リソース3: アーティファクト用S3バケット

  • 作成するCodePipelineパイプラインが利用するアーティファクト用S3バケットです。
  • 今回は"handson-cli-artifacts-XXXXXXXXXXXX"とします。

リソース4: CodeCommitリポジトリ名

  • 作成するCodePipelineパイプラインが利用するCodeCommitリポジトリの名称です。
  • 今回は"handson-cli-repository"とします。

リソース5: Gitブランチ名

  • 作成するCodePipelineパイプラインが監視するCodeCommitリポジトリのブランチ名です。
  • 今回は"develop"とします。

リソース6: デプロイ先S3バケット

  • 作成するCodePipelineパイプラインが利用するデプロイ先S3バケットです。
  • 今回は"handson-cli-website-XXXXXXXXXXXX"とします。

リソース7: IAMロール名

  • 作成するCodePipelineパイプラインが利用するIAMロールの名称です。
  • 今回は"AWSCodePipelineServiceRole-role"とします。

パラメータの指定

作業に必要なパラメータを変数に格納をします。

0.0. リージョンの指定

変数の設定

export AWS_DEFAULT_REGION='ap-northeast-1'

0.1. パイプライン定義ファイル用ディレクトリの指定

変数の設定:

DIR_CODEP_PIPELINE="${HOME}/tmp/conf-handson-cli"

0.2. CodePipelineパイプライン名の指定

CodePipelineパイプライン名を指定します。

変数の設定:

CODEP_PIPELINE_NAME='handson-cli-pipeline'

0.3. アーティファクト用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.4. CodeCommitリポジトリ名の指定

CodeCommitリポジトリ名を指定します。

変数の設定:

CODEC_REPOSITORY_NAME='handson-cli-repository'

0.5. Gitブランチ名の指定

Gitブランチ名を指定します。

変数の設定:

GIT_BRANCH_NAME='develop'

0.6. デプロイ先S3バケットの指定

デプロイ先S3バケットを指定します。

変数の設定:

S3_BUCKET_PREFIX_DEPLOY='handson-cli-website'

コマンド:

AWS_ID=$( \
  aws sts get-caller-identity \
    --query 'Account' \
    --output text \
) \
  && echo ${AWS_ID}

結果(例):

XXXXXXXXXXXX

変数の設定:

S3_BUCKET_DEPLOY="${S3_BUCKET_PREFIX_DEPLOY}-${AWS_ID}" \
  && echo ${S3_BUCKET_DEPLOY}

結果(例):

handson-cli-website-XXXXXXXXXXXX

0.7. IAMロール名の指定

IAMロール名を指定します。

変数の設定:

IAM_ROLE_NAME='AWSCodePipelineServiceRole-role'

パラメータの保存

設定されている変数の保存先となるファイル名を指定します。

変数の設定:

DIR_PARAMETER="${HOME}/tmp/parameter-handson-cli"
FILE_PARAMETER="${DIR_PARAMETER}/$(date +%Y-%m-%d)-codepipeline-pipeline_document-create-expand-source_codecommit-deploy_s3.env" \
  && echo ${FILE_PARAMETER}

結果(例):

${HOME}/tmp/parameter-handson-cli/2019-04-30-codepipeline-pipeline_document-create-expand-source_codecommit-deploy_s3.env

各変数に正しいパラメータ値が格納されていることを確認しながら保存します。

変数の確認:

cat << EOF > ${FILE_PARAMETER}

  # 0.0. AWS_DEFAULT_REGION:"ap-northeast-1"
         AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION}"

  # 0.1. DIR_CODEP_PIPELINE:"${HOME}/tmp/conf-handson-cli"
         DIR_CODEP_PIPELINE="${DIR_CODEP_PIPELINE}"
  # 0.2. CODEP_PIPELINE_NAME:"handson-cli-pipeline"
         CODEP_PIPELINE_NAME="${CODEP_PIPELINE_NAME}"
  # 0.3. S3_BUCKET_ARTIFACTS:"handson-cli-artifacts-XXXXXXXXXXXX"
         S3_BUCKET_ARTIFACTS="${S3_BUCKET_ARTIFACTS}"
  # 0.4. CODEC_REPOSITORY_NAME:"handson-cli-repository"
         CODEC_REPOSITORY_NAME="${CODEC_REPOSITORY_NAME}"
  # 0.5. GIT_BRANCH_NAME:"develop"
         GIT_BRANCH_NAME="${GIT_BRANCH_NAME}"
  # 0.6. S3_BUCKET_DEPLOY:"handson-cli-website-XXXXXXXXXXXX"
         S3_BUCKET_DEPLOY="${S3_BUCKET_DEPLOY}"
  # 0.7. IAM_ROLE_NAME:"AWSCodePipelineServiceRole-role"
         IAM_ROLE_NAME="${IAM_ROLE_NAME}"

EOF

cat ${FILE_PARAMETER}

下段の変数が入っていない、もしくは上段と同等の値が入っていない場合は、それぞれの手順番号に戻って変数の設定を行います。

タスクの実施

タスク標準時間:6分

1. 前処理

1.1. 状態確認に必要な情報の取得

パイプライン定義ファイル名の指定

変数の設定:

FILE_CODEP_PIPELINE="${DIR_CODEP_PIPELINE}/${CODEP_PIPELINE_NAME}.json" \
  && echo ${FILE_CODEP_PIPELINE}

結果(例):

${HOME}/tmp/conf-handson-cli/handson-cli-pipeline.json

1.2. 処理対象の状態確認

主処理の実施は、以下の状態であることを前提とします。

前提と異なることが判明した場合、直ちに処理を中止します。

事前条件1: CodePipelineパイプライン定義ファイル用ディレクトリ"${HOME}/tmp/conf-handson-cli"が存在する。

「CodePipelineパイプライン定義ファイル用ディレクトリ"${HOME}/tmp/conf-handson-cli"が存在する。」ことを確認します。

コマンド:

ls -d ${DIR_CODEP_PIPELINE}

結果(例):

${HOME}/tmp/conf-handson-cli

事前条件2: CodePipelineパイプライン定義ファイル"${HOME}/tmp/conf-handson-cli/handson-cli-pipeline.json"が存在しない。

「CodePipelineパイプライン定義ファイル"${HOME}/tmp/conf-handson-cli/handson-cli-pipeline.json"が存在しない。」ことを確認します。

コマンド:

! ls ${FILE_CODEP_PIPELINE}

結果(例):

ls: ${HOME}/tmp/conf-handson-cli/handson-cli-pipeline.json No such file or directory

事前条件3: 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

事前条件4: CodeCommitリポジトリ"handson-cli-repository"が存在する。

「CodeCommitリポジトリ"handson-cli-repository"が存在する。」ことを確認します。

コマンド:

aws codecommit list-repositories \
  --query "repositories[?repositoryName == \`${CODEC_REPOSITORY_NAME}\`].repositoryName" \
  --output text

結果(例):

handson-cli-repository

事前条件5: Gitブランチ"develop"が存在する。

「Gitブランチ"develop"が存在する。」ことを確認します。

事前条件6: S3バケット"handson-cli-website-XXXXXXXXXXXX"が存在する。

「S3バケット"handson-cli-website-XXXXXXXXXXXX"が存在する。」ことを確認します。

コマンド:

aws s3api list-buckets \
  --query "Buckets[?Name == \`${S3_BUCKET_DEPLOY}\`].Name" \
  --output text

結果(例):

handson-cli-website-XXXXXXXXXXXX

事前条件7: IAMロール"AWSCodePipelineServiceRole-role"が存在する。

「IAMロール"AWSCodePipelineServiceRole-role"が存在する。」ことを確認します。

コマンド:

aws iam list-roles \
  --query "Roles[?RoleName == \`${IAM_ROLE_NAME}\`].RoleName" \
  --output text

結果(例):

AWSCodePipelineServiceRole-role

1.3. 主処理に必要な情報の取得

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/AWSCodePipelineServiceRole-role

2. 主処理

パイプライン定義ファイルの作成

変数の確認:

cat << ETX

  # FILE_CODEP_PIPELINE:"${HOME}/tmp/conf-handson-cli/handson-cli-pipeline.json"
    FILE_CODEP_PIPELINE="${FILE_CODEP_PIPELINE}"
  # IAM_ROLE_ARN:"arn:aws:iam::XXXXXXXXXXXX:role/service-role/AWSCodePipelineServiceRole-role"
    IAM_ROLE_ARN="${IAM_ROLE_ARN}"
  # S3_BUCKET_ARTIFACTS:"handson-cli-artifacts-XXXXXXXXXXXX"
    S3_BUCKET_ARTIFACTS="${S3_BUCKET_ARTIFACTS}"
  # CODEC_REPOSITORY_NAME:"handson-cli-repository"
    CODEC_REPOSITORY_NAME="${CODEC_REPOSITORY_NAME}"
  # S3_BUCKET_DEPLOY:"handson-cli-website-XXXXXXXXXXXX"
    S3_BUCKET_DEPLOY="${S3_BUCKET_DEPLOY}"
  # GIT_BRANCH_NAME:"develop"
    GIT_BRANCH_NAME="${GIT_BRANCH_NAME}"

ETX

コマンド:

cat << EOF > ${FILE_CODEP_PIPELINE}
{
    "name": "${CODEP_PIPELINE_NAME}",
    "roleArn": "${IAM_ROLE_ARN}",
    "artifactStore": {
        "type": "S3",
        "location": "${S3_BUCKET_ARTIFACTS}"
    },
    "stages": [
        {
            "name": "Source",
            "actions": [
                {
                    "name": "Source",
                    "actionTypeId": {
                        "category": "Source",
                        "owner": "AWS",
                        "provider": "CodeCommit",
                        "version": "1"
                    },
                    "runOrder": 1,
                    "configuration": {
                        "BranchName": "${GIT_BRANCH_NAME}",
                        "PollForSourceChanges": "true",
                        "RepositoryName": "${CODEC_REPOSITORY_NAME}"
                    },
                    "outputArtifacts": [
                        {
                            "name": "SourceArtifact"
                        }
                    ],
                    "inputArtifacts": []
                }
            ]
        },
        {
            "name": "Deploy",
            "actions": [
                {
                    "name": "Deploy",
                    "actionTypeId": {
                        "category": "Deploy",
                        "owner": "AWS",
                        "provider": "S3",
                        "version": "1"
                    },
                    "runOrder": 1,
                    "configuration": {
                        "BucketName": "${S3_BUCKET_DEPLOY}",
                        "Extract": "true"
                    },
                    "outputArtifacts": [],
                    "inputArtifacts": [
                        {
                            "name": "SourceArtifact"
                        }
                    ]
                }
            ]
        }
    ],
    "version": 1
}
EOF

cat ${FILE_CODEP_PIPELINE}

結果(例):

{
    "name": "handson-cli-pipeline",
    "roleArn": "arn:aws:iam::XXXXXXXXXXXX:role/service-role/AWSCodePipelineServiceRole-role",
    "artifactStore": {
        "type": "S3",
        "location": "handson-cli-artifacts-XXXXXXXXXXXX"
    },
    "stages": [
        {
            "name": "Source",
            "actions": [
                {
                    "name": "Source",
                    "actionTypeId": {
                        "category": "Source",
                        "owner": "AWS",
                        "provider": "CodeCommit",
                        "version": "1"
                    },
                    "runOrder": 1,
                    "configuration": {
                        "BranchName": "develop",
                        "PollForSourceChanges": "true",
                        "RepositoryName": "handson-cli-repository"
                    },
                    "outputArtifacts": [
                        {
                            "name": "SourceArtifact"
                        }
                    ],
                    "inputArtifacts": []
                }
            ]
        },
        {
            "name": "Deploy",
            "actions": [
                {
                    "name": "Deploy",
                    "actionTypeId": {
                        "category": "Deploy",
                        "owner": "AWS",
                        "provider": "S3",
                        "version": "1"
                    },
                    "runOrder": 1,
                    "configuration": {
                        "BucketName": "handson-cli-website-XXXXXXXXXXXX",
                        "Extract": "true"
                    },
                    "outputArtifacts": [],
                    "inputArtifacts": [
                        {
                            "name": "SourceArtifact"
                        }
                    ]
                }
            ]
        }
    ],
    "version": 1
}

JSONファイルを作成したら、フォーマットが壊れてないか必ず確認します。

コマンド:

jsonlint -q ${FILE_CODEP_PIPELINE}

エラーが出力されなければOKです。

3. 後処理

完了条件の確認

主処理は、以下を満たしたときに成功したものとします。

完了条件1: CodePipelineパイプライン定義ファイル"${HOME}/tmp/conf-handson-cli/handson-cli-pipeline.json"が存在する。

「CodePipelineパイプライン定義ファイル"${HOME}/tmp/conf-handson-cli/handson-cli-pipeline.json"が存在する。」ことを確認します。

コマンド:

ls ${FILE_CODEP_PIPELINE}

結果(例):

${HOME}/tmp/conf-handson-cli/handson-cli-pipeline.json

完了