Java Spring Boot Web App を利用して、CodeCommit、CodeBuild、CodeDeploy、CodePipeline の利用方法の概要を学びます。
このハンズオンは、AWS Cloud9 上で実行する前提で記載していますが、どの環境でも動かせます。(OpenJDK 11 およびMaven があれば良いです。)
- IAM ポリシー
- IAM ユーザには以下のポリシーが必要になります
- AmazonDynamoDBFullAccess
- AWSCodeCommitFullAccess
- AWSCodeBuildAdminAccess
- AWSCodeDeployFullAccess
- AWSCloud9Administrator
- IAM ユーザには以下のポリシーが必要になります
- Cloud9 の起動
- 東京リージョンにて、Platform を"Amazon Linux 2" を指定してCloud9 を起動します。インスタンスタイプは、"t3.small" 以上を推奨します。
ここでは、Amazon Corretto をインストールします。
まず、Cloud9 上でターミナルウィンドウを開き、以下のコマンドを実行します。
wget https://corretto.aws/downloads/latest/amazon-corretto-11-x64-linux-jdk.rpm
sudo rpm -ihv /home/ec2-user/environment/amazon-corretto-11-x64-linux-jdk.rpm
ターミナル上で以下のコマンドを実行します。
sudo wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo
sudo sed -i s/\$releasever/6/g /etc/yum.repos.d/epel-apache-maven.repo
sudo yum install -y apache-maven
- 参考URL : Maven を使用して設定する
-
ローカルbuild 処理
git clone https://github.com/tomofuminijo/aws-codeseries-spring-webapp-handson.git cd aws-codeseries-spring-webapp-handson mvn package
-
ローカル環境でアプリケーション実行
- DynamoDB ローカルの実行
docker run -p 8000:8000 amazon/dynamodb-local
- Java の実行
java -jar target/my-greeting-web-1.0.0.jar --spring.profiles.active=dev
- DynamoDB ローカルの実行
-
ブラウザからアクセス
アプリケーションを実行すると以下のようなメッセージがターミナル右上に表示されます。Cloud9 Help Your code is running at https://xxxxxxxxxxxxx.vfs.cloud9.us-east-1.amazonaws.com
表示されたリンクをクリックするとアプリケーションにアクセスできます。
-
アプリの動作確認
-
まだ必要なテーブルやデータがDynamoDB 上に無いので、まず最初に表示された画面の"Greeting" ボタンの下の init リンクをリクックします。
何もエラー画面が表示されなければ正常に動作しています。 -
"Language" の入力欄に "ja" や"fr"、"ko" などと入力して"Greeting" ボタンを押すと、それぞれの言語にHello が表示されます。データはDynamoDB から取得されます。
-
以下のコマンドを叩くことで、DynamoDB ローカル上にテーブルが作成されていることを確認できます。
aws dynamodb list-tables --endpoint-url http://localhost:8000 --region localtest
-
動作確認が終わったらすべてのプロセスを終了します。
-
-
リポジトリの作成
ターミナルで以下のコマンドを実行し、CodeCommit 上にリポジトリを作成します。
aws codecommit create-repository --repository-name MyCodeSeriesHandsOn --repository-description "My Handson repository"
以下のような情報が返却されます。
{ "repositoryMetadata": { "repositoryName": "MyCodeSeriesHandsOn", "cloneUrlSsh": "ssh://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/MyCodeSeriesHandsOn", "lastModifiedDate": 1563268366.672, "repositoryDescription": "My Handson repository", "cloneUrlHttp": "https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/MyCodeSeriesHandsOn", "creationDate": 1563268366.672, "repositoryId": "xxxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx", "Arn": "arn:aws:codecommit:ap-northeast-1:your_account_id:MyCodeSeriesHandsOn", "accountId": "your_account_id" } }
上記の"cloneUrlHttp" の内容をコピーしておきます。
-
(Option) git-remote-codecommit のインストール
Cloud9 環境以外で実施している場合は、以下のURL を参考にgit-remote-codecommit をインストールしてください。
-
CodeCommit リポジトリへのpush
以下のコマンドを実行します。
git add . git commit -m "My First Commit" git remote remove origin git remote add origin codecommit::ap-northeast-1://MyCodeSeriesHandsOn git push origin main
-
CodeCommit リポジトリに確認
- マネジメントコンソールにアクセスしてCodeCommit リポジトリの内容を確認してみましょう
https://ap-northeast-1.console.aws.amazon.com/codesuite/codecommit/repositories/MyCodeSeriesHandsOn/browse?region=ap-northeast-1
- マネジメントコンソールにアクセスしてCodeCommit リポジトリの内容を確認してみましょう
CodeBuild を利用すると、多数の開発者がCodeCommit にコミットしたソースを指定したビルド手順で自動的にビルドすることができるよになります。 Build のためのサーバなどは管理不要です。
-
マネージメントコンソールにアクセスします。
-
サービスからS3 を選択します。
-
"バケットを作成する" ボタンを押して任意のバケットを作成します。
-
作成したバケットのバージョニングを有効化します。
-
サービスからCodeBuild を選択します。
-
"ビルドプロジェクトを作成する" ボタンを押します。
-
「ビルドプロジェクトを作成する」画面にて、以下の内容を入力します。指示していない項目に関してはデフォルトのままとします。
- プロジェクト名: MyCodeBuild
- 送信元
- ソースプロバイダ: AWS CodeCommit (デフォルト)
- リポジトリ: MyCodeSeriesHandsOn
- 環境
- 環境イメージ: マネージド型イメージ (デフォルト)
- オペレーティングシステム: Ubuntu
- ランタイム: Standard
- イメージ: aws/codebuild/standard:5.0
- アーティファクト
- タイプ: Amazon S3
- バケット名: 先程作成したバケットを選択します
- アーティファクトのパッケージ化: Zip にチェックを入れる
- 追加設定
- キャッシュタイプ: Amazon S3
- キャッシュバケット: 先程作成したバケットを選択します
- キャッシュパスのプレフィックス - オプショナル: cache
- キャッシュのライフサイクル (日) - オプショナル: "1" を入力した後に、"+ 有効期限を追加する" ボタンをクリックする -> S3 上に自動的にライフサイクルが設定される
-
"ビルドプロジェクトを作成する" ボタンをクリックします。
-
MyCodeBuild というビルドプロジェクトが正常に作成されたら、"ビルドの開始" ボタンをクリックします。
-
「ビルドの開始」画面では、全てデフォルトのままで再度"ビルドの開始" ボタンをクリックします。
-
ビルド処理は初回は5分ほど時間がかかります。
-
ビルド中にCodeBuild の画面にて、ビルドログなどでビルドの状況を確認できます。
-
ビルド処理が正常に終了したら、指定したS3 バケットにアーティファクトが出力されていることを確認します。
- MyCodeBuild が出力されていることを確認します
今回はCodeDeploy を利用してSpring Boot アプリをEC2 上にデプロイします。
- 以下のAWS 管理ポリシーをアタッチしたEC2 用のIAMロールを作成します。
- AmazonEC2RoleforAWSCodeDeploy
- AmazonDynamoDBFullAccess
- AmazonSSMManagedInstanceCore
- EC2 インスタンスを起動します。以下の内容を指定してください。
-
AMI: Amazon Linux 2
-
インスタンスタイプ: t2.micro
-
ネットワーク: Default VPC を利用
-
IAM ロール: 先ほど作成したIAMロール
-
ユーザデータは以下を指定する
#!/bin/bash yum -y update # install jdk wget https://corretto.aws/downloads/latest/amazon-corretto-11-x64-linux-jdk.rpm sudo rpm -ihv amazon-corretto-11-x64-linux-jdk.rpm
-
タグに、Name/MyHandsOnTarget を設定しておく
-
セキュリティグループは 8080 ポートを開けておく
-
-
IAM ロールにて、CodeDeploy 用のサービスロールを作成します。
- 対象サービス:CodeDeploy、ユースケース:CodeDeploy
- 以下のポリシーを関連付けます(デフォルトで設定済み)
- AWSCodeDeployRole
-
マネージメントコンソールでCodeDeploy サービス画面を表示します。
-
ナビゲーションペインにて、アプリケーション をクリックし、右側の画面にて "アプリケーションの作成" ボタンをクリックします。
-
以下を入力します。
- アプリケーション名: myhanodson-app
- コンピューティングプラットフォーム: EC2/オンプレミス
-
"アプリケーションの作成" ボタンをクリックします。
-
「デプロイグループ」タグの"デプロイグループの作成" ボタンをクリックします。
-
以下を入力します。指定されていないものはデフォルトのままとします。
- デプロイグループ名: myhandson-deploygroup
- サービスロール: 手順1で作成したIAMロール
- 環境設定
- Amzon EC2 インスタンス: チェック
- タググループのキー: Name
- 値:MyHandsOnTarget
- ロードバランサー
- ロードバランシングを有効にする:チェックを外す
-
"デプロイグループの作成"ボタンをクリックします。
-
「myhandson-deploygroup」画面にて、"デプロイの作成" ボタンをクリックします。
-
「Create deployment」 画面にて以下を入力します。
- デプロイグループ:myhandson-deploygroup
- リビジョンタイプ: "アプリケーションはAmazon S3 に格納されています" にチェック(デフォルト)
- リビジョンの場所: s3://your_code_build_artifact_bucket/MyCodeBuild
- リビジョンファイルの種類: .zip
-
"デプロイの作成" ボタンをクリックします。
-
デプロイが作成されるとともに、デプロイが開始されます。
-
正常にデプロイが終わったら、EC2 にブラウザからアクセスします。
- EC2 のパブリックIP を取得してブラウザで8080 ポートでアクセスしてみる
- ローカル環境と同じ画面が表示されることを確認する
ここまででCodeCommit/CodeBuild/CodeDeploy の構成ができましたが、まだ各サービスが単体で動いている状態です。 CodeCommit にコードがPush されたら、CodeBuild/CodeDeploy まで自動的に実行されるようにCodePiplelineを構成します。
-
マネージメントコンソールでCodePipeline を選択します。
-
"パイプラインを作成する" ボタンをクリックします。
-
以下の値を入力します。
- パイプライン名: myhandson-pipeline
- サービスロール: 新しいサービスロール(デフォルト)
-
"次に" ボタンをクリックします。
-
「ソースステージを追加する」 画面にて、以下を入力します。
- ソースプロバイダー: CodeCommit
- リポジトリ名: MyHandsOn
- ブランチ名: main
-
"次に" ボタンをクリックします。
-
「ビルドステージを追加する」画面にて、以下を入力します。
- プロバイダーを構築する: AWS CodeBuild
- プロジェクト名: MyCodeBuild
-
"次に" ボタンをクリックします。
-
「デプロイステージを追加する」画面にて、以下を入力します。
- デプロイプロバイダー: AWS CodeDeploy
- アプリケーション名: myhandson-app
- デプロイグループ: myhandson-deploygroup
-
"次に" ボタンをクリックします。
-
「レビュー」画面にて、"パイプラインを作成する" ボタンをクリックします。
-
Pipeline が作成されるとすぐに、現在の最新のリビジョンでパイプラインが実行されます。
CodeCommit にgit push してPipeline が自動的に実行されることを確認します。
-
Cloud9 にて、src/main/resources/templates/index.html を開きます。
-
"Hello! Ver: 1.0.0" となっているところを "Hello! Ver: 2.0.0" に変更します。
-
Cloud9 のターミナルで、以下のコマンドを実行してリポジトリにコードを push します
git add . git commit -m "ver 2.0.0" git push origin main
-
マネジメントコンソールのCodePipeline サービス画面にて、パイプラインが動作していることを確認します。
-
Pipeline が正常に動作したら、実際にEC2 インスタンスにアクセスして新しいバージョンに変わっていることを確認します。
以上です。