Bitbucket で ImageLabeller をデプロイする

当社のチームは Jira Software とさまざまな接続ツールを使用してアプリケーションを開発、デプロイ、管理する方法を説明するために、機械学習を使用してイメージにラベルを添付する AWS 上に構築されたシンプルなデモ アプリケーションである ImageLabeller を作成しました。

このページでは、Bitbucket で ImageLabeller をデプロイする方法について説明します。はじめに、ImageLabeller アーキテクチャ ページと AWS SageMaker のセットアップ ページをお読みの上、背景を確認することをお勧めします。

前提条件

Bitbucket アカウント用に SSH をまだ設定していない場合は、こちらの手順に従ってください

ImageLabeller のコードで公開されている GitHub リポジトリ

https://github.com/AtlassianOpenDevOpsGuides

Bitbucket Pipelines のデモ ビデオ

https://www.youtube.com/watch?v=QccHnSWE_BM

AWS S3 インフラストラクチャ リポジトリを作成する

通常、標準開発者ループでは開発者は Jira からタスクを取り出して、それを進行中の作業に移動して開発作業を完了します。Jira 課題 ID は、開発作業を Jira 課題に結びつけるキーです。これは、2 つのシステム間の中核となる統合コンポーネントです。

Jira から、AWS S3 インフラストラクチャ リポジトリを Bitbucket に追加するための新しい課題を作成します。課題 ID を書き留めます。この例では「IM-5」です。

Jira ボードで新しい課題を作成する

Bitbucket > [作成] > [リポジトリ] の順に移動します。

Bitbucket でリポジトリを作成する

適切なワークスペースプロジェクトを選択します。[Default branch name (デフォルトのブランチ名)] を mainline に設定します。[リポジトリを作成] をクリックして続行します。

プロジェクトのワークスペースをモーダルで選択する

ターミナルで s3_infra リポジトリに移動して次のコマンドを実行し、AWS CloudFormation template.yml ファイルを Bitbucket にプッシュします。

1 2 3 4 5 git add --all git commit -m "IM-5 add s3_infra repository to Bitbucket" git remote add origin git@bitbucket.org:pmmquickstartguides01/s3_infra.git git branch -m mainline git push -u origin mainline

Bitbucket Pipelines の有効化

[リポジトリ設定] > [設定] > [パイプラインを有効化] の順に移動します。

Bitbucket でパイプラインを有効にする

AWS アクセス キー リポジトリ変数を追加する

[Repository variables (リポジトリ変数)] に移動して AWS アクセス キー ID を入力、[追加] をクリックします。次に、AWS シークレット アクセス キーを入力して [追加] をクリックします。

AWS キー ID を入力する

デプロイ環境を設定する

[デプロイ] をクリックします。

[デプロイ] タブ

[環境を追加] をクリックして、新しい環境を追加します。この例では、US-WEST-1 にテスト環境、US-EAST-2 にステージング環境、US-WEST-2、US-EAST-1、CA-CENTRAL-1 に 3 つの本番環境があります。

デプロイ環境を追加

AWS にデプロイする bitbucket-pipelines.yml

ターミナルの s3_infra リポジトリに移動して、Jira 課題 ID にちなんだ名前のブランチを作成します。

1 git checkout -b IM-5

次の yaml で bitbucket-pipelines.yml ファイルを作成します。これによって、テスト、ステージング、本番の各環境のデプロイ ワークフローが定義されます。

 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 definitions: steps: - step: &deploy-test-usw1 name: Deploy Test us-west-1 script: - pipe: atlassian/aws-cloudformation-deploy:0.10.0 variables: AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID} AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY} AWS_DEFAULT_REGION: 'us-west-1' STACK_NAME: 'OpenDevOpsS3Infra' CAPABILITIES: ['CAPABILITY_IAM', 'CAPABILITY_AUTO_EXPAND'] WAIT: 'true' TEMPLATE: 'template.yml' - step: &deploy-staging-use2 name: Deploy Staging us-east-2 script: - pipe: atlassian/aws-cloudformation-deploy:0.10.0 variables: AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID} AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY} AWS_DEFAULT_REGION: 'us-east-2' STACK_NAME: 'OpenDevOpsS3Infra' CAPABILITIES: ['CAPABILITY_IAM', 'CAPABILITY_AUTO_EXPAND'] WAIT: 'true' TEMPLATE: 'template.yml' - step: &deploy-production-usw2 name: Deploy Production us-west-2 script: - pipe: atlassian/aws-cloudformation-deploy:0.10.0 variables: AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID} AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY} AWS_DEFAULT_REGION: 'us-west-2' STACK_NAME: 'OpenDevOpsS3Infra' CAPABILITIES: ['CAPABILITY_IAM', 'CAPABILITY_AUTO_EXPAND'] WAIT: 'true' TEMPLATE: 'template.yml' - step: &deploy-production-use1 name: Deploy Production us-east-1 script: - pipe: atlassian/aws-cloudformation-deploy:0.10.0 variables: AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID} AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY} AWS_DEFAULT_REGION: 'us-east-1' STACK_NAME: 'OpenDevOpsS3Infra' CAPABILITIES: ['CAPABILITY_IAM', 'CAPABILITY_AUTO_EXPAND'] WAIT: 'true' TEMPLATE: 'template.yml' - step: &deploy-production-cac1 name: Deploy Production ca-central-1 script: - pipe: atlassian/aws-cloudformation-deploy:0.10.0 variables: AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID} AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY} AWS_DEFAULT_REGION: 'ca-central-1' STACK_NAME: 'OpenDevOpsS3Infra' CAPABILITIES: ['CAPABILITY_IAM', 'CAPABILITY_AUTO_EXPAND'] WAIT: 'true' TEMPLATE: 'template.yml' pipelines: default: - step: <<: *deploy-test-usw1 deployment: Test us-west-1 - step: <<: *deploy-staging-use2 deployment: Staging us-east-2 branches: mainline: - step: <<: *deploy-production-usw2 deployment: Production us-west-2 - step: <<: *deploy-production-use1 deployment: Production us-east-1 - step: <<: *deploy-production-cac1 deployment: Production ca-central-1

bitbucket-pipelines.yml ファイルを理解する

定義とステップ

definitions セクションで一連の steps を定義します。各 step には、bitbucket-pipelines.yml ファイル全体で参照されるエイリアス、Bitbucket デプロイ画面に表示される namescript があります。script は、1 つ以上のコマンドの集合です。

 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 definitions: steps: - step: &deploy-test-usw1 name: Deploy Test us-west-1 script: - pipe: atlassian/aws-cloudformation-deploy:0.10.0 variables: AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID} AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY} AWS_DEFAULT_REGION: 'us-west-1' STACK_NAME: 'OpenDevOpsS3Infra' CAPABILITIES: ['CAPABILITY_IAM', 'CAPABILITY_AUTO_EXPAND'] WAIT: 'true' TEMPLATE: 'template.yml'

パイプ

このステップでは、atlassian/aws-cloudformation-deploy パイプを使用して、s3_infra template.yml ファイルで定義されている AWS S3 バケットをデプロイします。

1 - pipe: atlassian/aws-cloudformation-deploy:0.10.0

利用可能なパイプのセットはここにあります。atlassian/aws-cloudformation-deploy パイプのドキュメントはここにあります。

Pipelines

Pipelines が一連のステップを実行します。default のパイプラインは一連のステップで、pipelines で明示的に名前が付けられていないブランチに対して実行されます。この default のパイプラインは、テスト環境とステージング環境にデプロイするステップを実行します。

1 2 3 4 5 6 7 8 pipelines: default: - step: <<: *deploy-test-usw1 deployment: Test us-west-1 - step: <<: *deploy-staging-use2 deployment: Staging us-east-2

deployment によって、Jira と Bitbucket の統合が可能になります。

1 deployment: Test us-west-1

branches にある、具体的な名前の付いたブランチに対して実行する一連のステップを定義できます。以下のスニペットは、mainline ブランチの一連のステップを定義しています。

1 2 3 4 5 6 7 8 9 10 11 branches: mainline: - step: <<: *deploy-production-usw2 deployment: Production us-west-2 - step: <<: *deploy-production-use1 deployment: Production us-east-1 - step: <<: *deploy-production-cac1 deployment: Production ca-central-1

このトピックの詳細については、こちらの記事をご参照ください。

フィーチャー ブランチにプッシュ

コマンド ラインから次のコマンドを実行して、s3_infra リポジトリの IM-5 ブランチに変更をプッシュします。Jira 課題 ID とブランチ名をコミット メッセージに含めて、プロジェクトで何が起こっているかを Jira Bitbucket 統合で追跡できるようにします。

1 2 3 git add --all git commit -m "IM-5 add bitbucket-pipelines.yml" git push -u origin IM-5

[Pipelines]、[IM-5] の順にクリックして、実行中のパイプラインを確認します。

実行中のパイプラインを表示する

パイプライン自体をクリックすると、実行の詳細が表示されます。パイプラインは、us-west-1 のテスト環境と us-east-2 のステージング環境にデプロイする toscreenshot_s のステップを実行しました。

実行の詳細を表示する

プル リクエストを作成する

プル リクエストを作成するには [プル リクエスト]、[プル リクエストを作成] の順にクリックします。

プル リクエストの作成

ソース ブランチとしてのフィーチャー ブランチ、[ブランチのクローズ] チェックボックスの順に選択して [プル リクエストを作成] をクリックします。

プル リクエスト モーダルを作成する

コードの変更を確認後、プル リクエストを [承認] して [マージ] します。

リクエストの承認とマージ

[マージ] をクリックすると、プル リクエストのマージ画面が開きます。[課題をトランジション] チェックボックスを選択して [マージ] をクリックします。

課題のトランジション チェックボックス

[Pipelines] をクリックして、メインライン パイプラインを監視します。

メイン パイプラインを監視

IM-5 ブランチが消えました。mainline ブランチは残っており、パイプラインが実行中です。[Pipelines] をクリックします。

パイプラインは実行中です

パイプラインは、us-west-2、us-east-1、ca-central-1 の本番環境にデプロイするステップを実行しました。パイプラインが失敗した場合は、[再実行] ボタンをクリックしてパイプラインを再実行できます。


不正なデプロイをロールバックする

デプロイをロールバックするには [デプロイ] をクリックします。

デプロイメント

ロールバックする環境をクリックして過去のデプロイ リストを取得し、ロールバック先のバージョンを選択して [再デプロイ] をクリックします。

デプロイするバージョンを選択する

変更が正しいことを確認して [再デプロイ] をクリックします。

変更が正しいことを確認する

選択した環境のみが再デプロイされます。

選択した環境が再デプロイされます

SubmitImage AWS Lambda 用のリポジトリを作成する

Jira に移動して、Bitbucket に SubmitImage リポジトリを追加するための Jira 課題を作成します。Jira 課題 ID を書き留めます。この例では「IM-6」です。

Jira 課題を作成する

Bitbucket に移動して [作成]、[リポジトリ] の順にクリックします。

リポジトリを作成する

適切なワークスペースプロジェクトを選択します。[デフォルトのブランチ名] を mainline に設定します。[リポジトリを作成] をクリックして続行します。

ワークスペースとプロジェクトを選択する

ターミナルで SubmitImage リポジトリに移動して、次のコマンドを実行して AWS Lambda コードを Bitbucket にプッシュします。Jira 課題 ID とブランチ名をコミット メッセージに含めて、プロジェクトで何が起こっているかを Jira Bitbucket 統合で追跡できるようにします。

1 2 3 4 5 git add --all git commit -m "IM-6 add SubmitImage to Bitbucket" git remote add origin git@bitbucket.org:pmmquickstartguides01/submitimage.git git branch -m mainline git push -u origin mainline

パイプラインを有効化

[リポジトリ設定]、[設定]、[パイプラインを有効化] の順に移動します。

パイプラインを有効化

リポジトリ変数を追加

[リポジトリ変数] をクリックして、AWS アクセス キー ID、AWS シークレット アクセス キー、AWS アカウント ID を追加します。AWS アクセス キーに関連付けられた IAM ユーザーに、AdministratorAccess を付与します。個別の AWS アクセス ポリシーを選択することで、よりきめ細かなアクセス コントロールを使用できます。

リポジトリ変数

デプロイ環境を追加

[デプロイ]、[環境を追加] の順にクリックして、新しい環境を追加します。us-west-1 のテスト環境、us-east-2 のステージング環境、us-west-2、us-east-1、ca-central-1 の 3 つの本番環境があります。

デプロイ環境を追加

SSH キーを作成

Bitbucket の SubmitImage リポジトリに移動して、[リポジトリ設定]、[SSH キー]、[キーを生成] の順にクリックします。

SSH キーを作成

SystemTests リポジトリを作成する際に、この SSH キーが必要になります。

SSH キーの詳細

AWS にデプロイする bitbucket-pipelines.yml

ターミナルの SubmitImage リポジトリに移動して、Jira 課題 ID にちなんだ名前のブランチを作成します。

1 git checkout -b IM-6

次の yaml で bitbucket-pipelines.yml ファイルを作成します。これによって、テスト、ステージング、本番の各環境の Bitbucket パイプラインが定義されます。

 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 definitions: steps: -step: &rununittests name: run unit tests image: golang:buster script: - cd submitImage - go test ./opendevopslambda/... -step: &deploy-test-usw1 name: Deploy Test us-west-1 image: amazon/aws-sam-cli-build-image-provided script: - curl https://dl.google.com/go/go1.16.3.linux-amd64.tar.gz -o go1.16.3.tar.gz - rm -rf /usr/local/go - tar -C /usr/local -xzf go1.16.3.tar.gz - export PATH=$PATH:/usr/local/go/bin - go version - make - ls -lah /opt/atlassian/pipelines/agent/build/build/ - pipe: atlassian/aws-sam-deploy:1.2.0 variables: AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID} AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY} AWS_DEFAULT_REGION: 'us-west-1' STACK_NAME: 'OpenDevOpsSubmitImage' CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ] TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-west-1-${AWS_ACCOUNT_ID}/submit-image-packaged.yml' WAIT: 'true' DEBUG: 'true' S3_BUCKET: 'open-devops-code-us-west-1-${AWS_ACCOUNT_ID}' SAM_TEMPLATE: 'build/template.yaml' -step: &integration-test-usw1 name: Integration test usw1 image: golang:buster script: - git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git - cd systemtests - go test -v ./... -aws_region=us-west-1 -step: &deploy-staging-use2 name: Deploy Staging us-east-2 image: amazon/aws-sam-cli-build-image-provided script: - curl https://dl.google.com/go/go1.16.3.linux-amd64.tar.gz -o go1.16.3.tar.gz - rm -rf /usr/local/go - tar -C /usr/local -xzf go1.16.3.tar.gz - export PATH=$PATH:/usr/local/go/bin - go version - make - ls -lah /opt/atlassian/pipelines/agent/build/build/ - BITBUCKET_PIPE_SHARED_STORAGE_DIR="/opt/atlassian/pipelines/agent/build/.bitbucket/pipelines/generated/pipeline/pipes" - chmod -R o+rw $BITBUCKET_PIPE_SHARED_STORAGE_DIR - pipe: atlassian/aws-sam-deploy:1.2.0 variables: AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID} AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY} AWS_DEFAULT_REGION: 'us-east-2' STACK_NAME: 'OpenDevOpsSubmitImage' CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ] TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-east-2-${AWS_ACCOUNT_ID}/submit-image-packaged.yml' WAIT: 'true' DEBUG: 'true' S3_BUCKET: 'open-devops-code-us-east-2-${AWS_ACCOUNT_ID}' SAM_TEMPLATE: 'build/template.yaml' -step: &integration-test-use2 name: Integration test use2 image: golang:buster script: - git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git - cd systemtests - go test -v ./... -aws_region=us-east-2 -step: &deploy-production-usw2 name: Deploy Production us-west-2 image: amazon/aws-sam-cli-build-image-provided script: - curl https://dl.google.com/go/go1.16.3.linux-amd64.tar.gz -o go1.16.3.tar.gz - rm -rf /usr/local/go - tar -C /usr/local -xzf go1.16.3.tar.gz - export PATH=$PATH:/usr/local/go/bin - go version - make - ls -lah /opt/atlassian/pipelines/agent/build/build/ - pipe: atlassian/aws-sam-deploy:1.2.0 variables: AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID} AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY} AWS_DEFAULT_REGION: 'us-west-2' STACK_NAME: 'OpenDevOpsSubmitImage' CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ] TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-west-2-${AWS_ACCOUNT_ID}/submit-image-packaged.yml' WAIT: 'true' DEBUG: 'true' S3_BUCKET: 'open-devops-code-us-west-2-${AWS_ACCOUNT_ID}' SAM_TEMPLATE: 'build/template.yaml' -step: &integration-test-usw2 name: Integration test usw2 image: golang:buster script: - git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git - cd systemtests - go test -v ./... -aws_region=us-west-2 -step: &deploy-production-use1 name: Deploy Production us-east-1 image: amazon/aws-sam-cli-build-image-provided script: - curl https://dl.google.com/go/go1.16.3.linux-amd64.tar.gz -o go1.16.3.tar.gz - rm -rf /usr/local/go - tar -C /usr/local -xzf go1.16.3.tar.gz - export PATH=$PATH:/usr/local/go/bin - go version - make - ls -lah /opt/atlassian/pipelines/agent/build/build/ - BITBUCKET_PIPE_SHARED_STORAGE_DIR="/opt/atlassian/pipelines/agent/build/.bitbucket/pipelines/generated/pipeline/pipes" - chmod -R o+rw $BITBUCKET_PIPE_SHARED_STORAGE_DIR - pipe: atlassian/aws-sam-deploy:1.2.0 variables: AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID} AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY} AWS_DEFAULT_REGION: 'us-east-1' STACK_NAME: 'OpenDevOpsSubmitImage' CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ] TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-east-1-${AWS_ACCOUNT_ID}/submit-image-packaged.yml' WAIT: 'true' DEBUG: 'true' S3_BUCKET: 'open-devops-code-us-east-1-${AWS_ACCOUNT_ID}' SAM_TEMPLATE: 'build/template.yaml' -step: &integration-test-use1 name: Integration test use1 image: golang:buster script: - git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git - cd systemtests - go test -v ./... -aws_region=us-east-1 -step: &deploy-production-cac1 name: Deploy Production ca-central-1 image: amazon/aws-sam-cli-build-image-provided script: - curl https://dl.google.com/go/go1.16.3.linux-amd64.tar.gz -o go1.16.3.tar.gz - rm -rf /usr/local/go - tar -C /usr/local -xzf go1.16.3.tar.gz - export PATH=$PATH:/usr/local/go/bin - go version - make - ls -lah /opt/atlassian/pipelines/agent/build/build/ - BITBUCKET_PIPE_SHARED_STORAGE_DIR="/opt/atlassian/pipelines/agent/build/.bitbucket/pipelines/generated/pipeline/pipes" - chmod -R o+rw $BITBUCKET_PIPE_SHARED_STORAGE_DIR - pipe: atlassian/aws-sam-deploy:1.2.0 variables: AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID} AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY} AWS_DEFAULT_REGION: 'ca-central-1' STACK_NAME: 'OpenDevOpsSubmitImage' CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ] TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-ca-central-1-${AWS_ACCOUNT_ID}/submit-image-packaged.yml' WAIT: 'true' DEBUG: 'true' S3_BUCKET: 'open-devops-code-ca-central-1-${AWS_ACCOUNT_ID}' SAM_TEMPLATE: 'build/template.yaml' -step: &integration-test-cac1 name: Integration test cac1 image: golang:buster script: - git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git - cd systemtests - go test -v ./... -aws_region=ca-central-1 pipelines: default: - step: *rununittests - step: <<: *deploy-test-usw1 deployment: Test us-west-1 # - step: *integration-test-usw1 - step: <<: *deploy-staging-use2 deployment: Staging us-east-2 # - step: *integration-test-use2 branches: mainline: - step: <<: *deploy-production-usw2 deployment: Production us-west-2 # - step: *integration-test-usw2 - step: <<: *deploy-production-use1 deployment: Production us-east-1 # - step: *integration-test-use1 - step: <<: *deploy-production-cac1 deployment: Production ca-central-1 # - step: *integration-test-cac1

統合テストの実行は、今のところコメント アウトされています。システム テストは、アプリケーション全体がデプロイされたときにのみ合格します。リポジトリの統合テスト ステップのコメントを解除して、ImageLabeller のすべてのコンポーネントがデプロイされたら、もう一度プッシュしてデプロイ パイプラインを実行します。

bitbucket-pipelines.yml ファイルを理解する

このステップでは、SubmitImage コード ベースから単体テストを実行します。

1 2 3 4 5 6 -step: &rununittests name: run unit tests image: golang:buster script: - cd submitImage - go test ./opendevopslambda/...

このステップでは、AWS SAM を使用して SubmitImage AWS Lambda を us-west-2 にデプロイします。このパイプのドキュメントはここにあります。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 -step: &deploy-usw2-prod name: deploy us-west-2 prod image: amazon/aws-sam-cli-build-image-provided script: - curl https://dl.google.com/go/go1.16.3.linux-amd64.tar.gz -o go1.16.3.tar.gz - rm -rf /usr/local/go - tar -C /usr/local -xzf go1.16.3.tar.gz - export PATH=$PATH:/usr/local/go/bin - go version - make - pipe: atlassian/aws-sam-deploy:1.2.0 variables: AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID} AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY} AWS_DEFAULT_REGION: 'us-west-2' STACK_NAME: 'OpenDevOpsSubmitImage' CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ] TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-west-2-${AWS_ACCOUNT_ID}/submit-image-packaged.yml' WAIT: 'true' DEBUG: 'true' S3_BUCKET: 'open-devops-code-us-west-2-${AWS_ACCOUNT_ID}' SAM_TEMPLATE: 'build/template.yaml'

このステップでは、SystemTests リポジトリのクローンを作成して、us-west-2 で統合テストを実行します。

1 2 3 4 5 6 7 -step: &integration-test-usw2 name: Integration test usw2 image: golang:buster script: - git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git - cd systemtests - go test -v ./... -aws_region=us-west-2

フィーチャー ブランチにプッシュ

コマンド ラインから次のコマンドを実行して、変更を SubmitImage リポジトリの IM-8 ブランチにプッシュします。

1 2 3 git add --all git commit -m "IM-6 add bitbucket-pipelines.yml to SubmitImage" git push -u origin IM-6

[Pipelines]、[IM-6] の順にクリックして、実行中のパイプラインを確認します。

実行中のパイプラインのスクリーンショット

プル リクエストを作成する

プル リクエストを作成するには [プル リクエスト]、[プル リクエストを作成] の順にクリックします。プル リクエストが終了したら [Pipelines] をクリックして本番環境のデプロイを確認します。

Bitbucket Pipelines における本番デプロイのスクリーンショット

InvokeLabeller AWS Lambda のリポジトリを作成する

Jira に移動して、Bitbucket に InvokeLabeller リポジトリを追加するための Jira 課題を作成します。Jira 課題 ID を書き留めます。この例では「IM-10」です。

InvokeLabeller AWS Lambda を追加する Jira 課題のスクリーンショット

Bitbucket に移動して [作成]、[リポジトリ] の順にクリックします。適切なワークスペースプロジェクトを選択します。[デフォルトのブランチ名] を mainline に設定します。[リポジトリを作成] をクリックして続行します。

Bitbucket リポジトリ「invokelabeller」作成のスクリーンショット

ターミナルで InvokeLabeller リポジトリに移動して、次のコマンドを実行して AWS Lambda コードを Bitbucket にプッシュします。Jira 課題 ID とブランチ名をコミット メッセージに含めて、プロジェクトで何が起こっているかを Jira Bitbucket 統合で追跡できるようにします。

1 2 3 4 5 git add --all git commit -m "IM-10 add InvokeLabeller to Bitbucket" git remote add origin git@bitbucket.org:pmmquickstartguides01/invokelabeller.git git branch -m mainline git push -u origin mainline

パイプラインを有効化

[リポジトリ設定]、[設定]、[パイプラインを有効化] の順に移動します。

パイプラインを有効化

リポジトリ変数を追加

[リポジトリ変数] をクリックして、AWS アクセス キー ID、AWS シークレット アクセス キー、AWS アカウント ID を追加します。AWS アクセス キーに関連付けられた IAM ユーザーに、AdministratorAccess を付与します。個別の AWS アクセス ポリシーを選択することで、よりきめ細かなアクセス コントロールを使用できますが、詳細は自由に設定できます。

リポジトリ変数

デプロイ環境を追加

[デプロイ]、[環境を追加] の順にクリックして、新しい環境を追加します。us-west-1 のテスト環境、us-east-2 のステージング環境、us-west-2、us-east-1、ca-central-1 の 3 つの本番環境があります。

デプロイ環境を追加

SSH キーを作成

Bitbucket の SubmitImage リポジトリに移動して、[リポジトリ設定]、[SSH キー]、[キーを生成] の順にクリックします。

SSH キーの詳細

AWS にデプロイする bitbucket-pipelines.yml

ターミナルの InvokeLabeller リポジトリに移動して、Jira 課題 ID にちなんだ名前のブランチを作成します。

1 git checkout -b IM-10

次の yaml で bitbucket-pipelines.yml ファイルを作成します。これによって、テスト、ステージング、本番の各環境の Bitbucket パイプラインが定義されます。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 definitions: steps: -step: &rununittests name: run unit tests image: python:rc-buster script: - pip3 install pytest - pip3 install moto - pip3 install -r tst/requirements.txt --user - python3 -m pytest -v tst/unit --junitxml=test-reports/report.xml -step: &deploy-usw1-test name: deploy us-west-1 test image: amazon/aws-sam-cli-build-image-python3.8 script: - pipe: atlassian/aws-sam-deploy:1.2.0 variables: AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID} AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY} AWS_DEFAULT_REGION: 'us-west-1' STACK_NAME: 'OpenDevOpsImageLabeller' CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ] TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-west-1-${AWS_ACCOUNT_ID}/image-labeller-packaged.yml' WAIT: 'true' DEBUG: 'true' S3_BUCKET: 'open-devops-code-us-west-1-${AWS_ACCOUNT_ID}' SAM_TEMPLATE: 'template.yml' -step: &integration-test-usw1 name: integration test usw1 image: golang:buster script: - git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git - cd systemtests - go test -v ./... -aws_region=us-west-1 -step: &deploy-use2-staging name: deploy us-east-2 staging image: amazon/aws-sam-cli-build-image-python3.8 script: - BITBUCKET_PIPE_SHARED_STORAGE_DIR="/opt/atlassian/pipelines/agent/build/.bitbucket/pipelines/generated/pipeline/pipes" - chmod -R o+rw $BITBUCKET_PIPE_SHARED_STORAGE_DIR - pipe: atlassian/aws-sam-deploy:1.2.0 variables: AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID} AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY} AWS_DEFAULT_REGION: 'us-east-2' STACK_NAME: 'OpenDevOpsImageLabeller' CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ] TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-east-2-${AWS_ACCOUNT_ID}/image-labeller-packaged.yml' WAIT: 'true' DEBUG: 'true' S3_BUCKET: 'open-devops-code-us-east-2-${AWS_ACCOUNT_ID}' SAM_TEMPLATE: 'template.yml' -step: &integration-test-use2 name: integration test use2 image: golang:buster script: - git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git - cd systemtests - go test -v ./... -aws_region=us-east-2 -step: &deploy-usw2-prod name: deploy us-west-2 prod image: amazon/aws-sam-cli-build-image-python3.8 script: - pipe: atlassian/aws-sam-deploy:1.2.0 variables: AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID} AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY} AWS_DEFAULT_REGION: 'us-west-2' STACK_NAME: 'OpenDevOpsImageLabeller' CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ] TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-west-2-${AWS_ACCOUNT_ID}/image-labeller-packaged.yml' WAIT: 'true' DEBUG: 'true' S3_BUCKET: 'open-devops-code-us-west-2-${AWS_ACCOUNT_ID}' SAM_TEMPLATE: 'template.yml' -step: &integration-test-usw2 name: integration test usw2 image: golang:buster script: - git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git - cd systemtests - go test -v ./... -aws_region=us-west-2 -step: &deploy-use1-prod name: deploy us-east-1 prod image: amazon/aws-sam-cli-build-image-python3.8 script: - BITBUCKET_PIPE_SHARED_STORAGE_DIR="/opt/atlassian/pipelines/agent/build/.bitbucket/pipelines/generated/pipeline/pipes" - chmod -R o+rw $BITBUCKET_PIPE_SHARED_STORAGE_DIR - pipe: atlassian/aws-sam-deploy:1.2.0 variables: AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID} AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY} AWS_DEFAULT_REGION: 'us-east-1' STACK_NAME: 'OpenDevOpsImageLabeller' CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ] TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-east-1-${AWS_ACCOUNT_ID}/image-labeller-packaged.yml' WAIT: 'true' DEBUG: 'true' S3_BUCKET: 'open-devops-code-us-east-1-${AWS_ACCOUNT_ID}' SAM_TEMPLATE: 'template.yml' -step: &integration-test-use1 name: integration test use1 image: golang:buster script: - git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git - cd systemtests - go test -v ./... -aws_region=us-east-1 -step: &deploy-cac1-prod name: deply ca-central-1 prod image: amazon/aws-sam-cli-build-image-python3.8 script: - BITBUCKET_PIPE_SHARED_STORAGE_DIR="/opt/atlassian/pipelines/agent/build/.bitbucket/pipelines/generated/pipeline/pipes" - chmod -R o+rw $BITBUCKET_PIPE_SHARED_STORAGE_DIR - pipe: atlassian/aws-sam-deploy:1.2.0 variables: AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID} AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY} AWS_DEFAULT_REGION: 'ca-central-1' STACK_NAME: 'OpenDevOpsImageLabeller' CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ] TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-ca-central-1-${AWS_ACCOUNT_ID}/image-labeller-packaged.yml' WAIT: 'true' DEBUG: 'true' S3_BUCKET: 'open-devops-code-ca-central-1-${AWS_ACCOUNT_ID}' SAM_TEMPLATE: 'template.yml' -step: &integration-test-cac1 name: integration test cac1 image: golang:buster script: - git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git - cd systemtests - go test -v ./... -aws_region=ca-central-1 pipelines: default: - step: *rununittests - step: <<: *deploy-usw1-test deployment: us-west-1 Test # - step: *integration-test-usw1 - step: <<: *deploy-use2-staging deployment: us-east-2 Staging # - step: *integration-test-use2 branches: mainline: - step: <<: *deploy-usw2-prod deployment: us-west-2 Prod # - step: *integration-test-usw2 - step: <<: *deploy-use1-prod deployment: us-east-1 Prod # - step: *integration-test-use1 - step: <<: *deploy-cac1-prod deployment: ca-central-1 Prod # - step: *integration-test-cac1

統合テストの実行は、今のところコメント アウトされています。システム テストは、アプリケーション全体がデプロイされたときにのみ合格します。リポジトリの統合テスト ステップのコメントを解除して、ImageLabeller のすべてのコンポーネントがデプロイされたら、もう一度プッシュしてデプロイ パイプラインを実行します。

bitbucket-pipelines.yml ファイルを理解する

このステップでは、InvokeLabeller コード ベースからユニット テストを実行します。

1 2 3 4 5 6 -step: &rununittests name: run unit tests image: golang:buster script: - cd submitImage - go test ./opendevopslambda/...

AWS SageMaker エンドポイントで src/app.py をアップデートする

InvokeLabeller の src/app.py ファイルを開いて、query_endpoint を探します。endpoint_name とクライアントの region_name を、AWS SageMaker ノートブックと一致するように変更します。

1 2 3 4 5 6 def query_endpoint(img): endpoint_name = 'jumpstart-dft-image-labeller-endpoint' client = boto3.client(service_name='runtime.sagemaker', region_name='us-west-1') response = client.invoke_endpoint(EndpointName=endpoint_name, ContentType='application/x-image', Body=img) model_predictions = json.loads(response['Body'].read())['predictions'][0] return model_predictions

フィーチャー ブランチにプッシュ

コマンド ラインから次のコマンドを実行して、変更を InvokeLabeller リポジトリの IM-10 ブランチにプッシュします。

1 2 3 git add --all git commit -m "IM-10 add bitbucket-pipelines.yml to InvokeLabeller" git push -u origin IM-10

[Pipelines]、[IM-10] の順にクリックして、実行中のパイプラインを確認します。

Bitbucket で実行中のパイプラインのスクリーンショット

プル リクエストを作成する

プル リクエストを作成するには [プル リクエスト]、[プル リクエストを作成] の順にクリックします。プル リクエストが終了したら [Pipelines] をクリックして本番環境のデプロイを確認します。

Bitbucket の invokelabeller の本番デプロイのスクリーンショット

システム テスト用のリポジトリを作成する

Jira に移動して、Bitbucket に SystemTests リポジトリを追加するための新しい課題を作成します。課題 ID を書き留めます。この例では「IM-7」です。

システム テスト用の Jira 課題を作成する

Bitbucket に移動して [作成]、[リポジトリ] の順にクリックします。

SystemTests の Bitbucket リポジトリを作成する

適切なワークスペースプロジェクトを選択します。[デフォルトのブランチ名] を mainline に設定します。[リポジトリを作成] をクリックして続行します。

SystemTests の新しい Bitbucket リポジトリを作成する

ターミナルで SystemTests リポジトリに移動して、次のコマンドを実行してコードを Bitbucket にプッシュします。

1 2 3 4 5 git add --all git commit -m "IM-7 add SystemTests repository to Bitbucket" git remote add origin git@bitbucket.org:pmmquickstartguides01/systemtests.git git branch -M mainline git push -u origin mainline

SystemTests リポジトリには bitbucket-pipelines.yml ファイルは不要です。他のパイプラインを実行するためのテストを提供するため、独自のパイプラインはありません。

SubmitImage、GetImageLabel、InvokeLabeller から SSH キーを追加する

[リポジトリ設定]、[アクセス キー] の順にクリックします。

SSH アクセス キーを SystemTests に追加する

[キーを追加] をクリックして、SubmitImage、GetImageLabel、または InvokeLabeller からコピーした SSH キーを貼り付けて [SSH キーを追加] をクリックします。

SSH キーを追加する

おめでとうございます、これで完了です! ImageLabeller がデプロイできました。次のステップでは、Opsgenie で ImageLabeller の監視をセットアップします。

 

最終更新日 2021年09月29日)
次でキャッシュ 3:47 AM on Oct 19, 2021 |

その他のヘルプ