Protonは、アプリケーション開発に必要なAWS環境、継続的インテグレーション/継続的デプロイパイプラインを開発者が様々なインタフェース、言語を意識することなくProton上から利用することができることに大きなメリットがあります。
本ハンズオンは、アプリケーション実行に必要な環境構築に責任をもつインフラエンジニア、アプリケーション開発に責任をもつ開発エンジニアとそれぞれの観点で作業を記載しています。それぞれの作業内容を理解し、Protonを実際に利用する時のイメージを持ってもらうことを目的としています。
Protonから構築される環境は下記図となります。
Proton
Cloud9
CodeBuild
CodePipline
ECS Fargate
Protonの構築はAWS CLIを利用して進めていきます。AWS CLIはCloud9上で実行しますので、まずはCloud9を作成していきましょう。
※Cloud9のページに移動する前に別タブ等でマネジメントコンソールのウインドウを開いておく事。後述で利用します。
VPCウィザードを起動をクリック
VPC名、アベイラリティーゾーンをus-west-2aを選択し、VPCの作成をクリック
その後、Cloud9の作成画面にて、更新ボタンをクリックする
※IPv4 CIDRブロックは10.0.0./16とする
※パブリックのサブネットのIPv4 CIDRは10.0.0.0/24とする
https://github.com/aws-samples/aws-proton-sample-fargate-service
Protonの構築はAWS CLIを利用して進めていきます。AWS CLIはCloud9上で実行しますので、まずはCloud9を作成していきましょう。
①AWS CLIの現在のバージョンを確認する aws --version ⇒aws-cli/1.19.87 Python/2.7.18 ②pip3でaws cliの最新バージョンをインストールする pip3 install --upgrade --user awscli ③awsを含むフォルダがPATH変数の一部であることを確認する ls -a ~ ⇒.awsが含まれる事 ④PATHを書き換える export PATH=$HOME/.local/bin:$PATH ⑤プロファイルを現在のセッションに再ロードする source ~/.bash_profile ⑥AWS CLIのバージョンが1.19.91になっている事を確認する aws --version ⇒aws-cli/1.19.91 Python/3.7.9 Linux/4.14.232-176.381.amzn2.x86_64 botocore/1.20.91
sudo yum install -y jq
git clone \ https://github.com/aws-samples/aws-proton-sample-templates.git
cd ~/environment/aws-proton-sample-templates/loadbalanced-fargate-svc
account_id=`aws sts get-caller-identity|jq -r ".Account"`
echo $account_id
aws proton help
aws s3api create-bucket \ --region us-west-2 \ --bucket "proton-cli-templates-${account_id}" \ --create-bucket-configuration LocationConstraint=us-west-2
左上の Cloud9 のアイコンをクリックすると出てくる、Go To Your Dashboard をクリックすると新しいタブを開くことができます。
EC2サービスを選択後、aws-cloud9-XXのインスタンスをチェックし、アクションからセキュリティ、IAMロールを変更をクリック
新しいIAMロールを作成をクリックし、IAM作成画面に遷移してください。
EC2を選択し、アクセス権限に移動
AdministratorAccess権限にチェックを入れ、任意の名前でIAMロールを作成する
作成後、EC2のアタッチ画面で更新ボタンをクリックし、Cloud9用のEC2に作成したIAMロールをアタッチする。
Cloud9のコンソールに戻り、右上の歯車マークからAWS Settingsを選択し、
CredentialsのAWS managed temporary credentialsのチェックを無効化する
以上でProtonを利用する下準備は完了です。
Protonにサンプルの環境テンプレートを登録します。環境テンプレートは、VPC、サブネットなどアプリケーションの実行環境(本ハンズオンではECS Fargate)が稼働するために必要なインフラ構成を定義したCloudFormationテンプレートとなります。
本ハンズオンで利用するサンプルのテンプレートはECSクラスターと2つのパブリックサブネットを持つVPCで構成されています。
aws proton create-environment-template \ --region us-west-2 \ --name "public-vpc" \ --display-name "PublicVPC" \ --description "VPC with Public Access and ECS Cluster"
レスポンス例:
{ "environmentTemplate": { "arn": "arn:aws:proton:us-west-2:123456789012:environment-template/public-vpc", "createdAt": 1623317847.386, "description": "VPC with Public Access and ECS Cluster", "displayName": "PublicVPC", "lastModifiedAt": 1623317847.386, "name": "public-vpc" } }
tar -zcvf env-template.tar.gz environment/ aws s3 cp env-template.tar.gz s3://proton-cli-templates-${account_id}/env-template.tar.gz \ --region us-west-2 rm env-template.tar.gz aws proton create-environment-template-version \ --region us-west-2 \ --template-name "public-vpc" \ --description "Version 1" \ --source s3="{bucket=proton-cli-templates-${account_id},key=env-template.tar.gz}"
レスポンス例:
{ "environmentTemplateVersion": { "arn": "arn:aws:proton:us-west-2:123456789012:environment-template/public-vpc:1.0", "createdAt": 1623317807.346, "description": "Version 1", "lastModifiedAt": 1623317807.346, "majorVersion": "1", "minorVersion": "0", "status": "REGISTRATION_IN_PROGRESS", "templateName": "public-vpc" } }
aws proton get-environment-template-version \ --region us-west-2 \ --template-name "public-vpc" \ --major-version "1" \ --minor-version "0"
レスポンス例:
{ "environmentTemplateVersion": { "status": "DRAFT", "majorVersion": "1", "statusMessage": "", "minorVersion": "0", "templateName": "public-vpc", "lastModifiedAt": 1630393516.525, "arn": "arn:aws:proton:us-west-2:123456789012:environment-template/public-vpc:1.0", "schema": "schema:\n format:\n openapi: \"3.0.0\"\n environment_input_type: \"PublicEnvironmentInput\"\n types:\n PublicEnvironmentInput:\n type: object\n description: \"Input properties for my environment\"\n properties:\n vpc_cidr:\n type: string\n description: \"This CIDR range for your VPC\"\n default: 10.0.0.0/16\n pattern: ([0-9]{1,3}\\.){3}[0-9]{1,3}($|/(16|24))\n subnet_one_cidr:\n type: string\n description: \"The CIDR range for subnet one\"\n default: 10.0.0.0/24\n pattern: ([0-9]{1,3}\\.){3}[0-9]{1,3}($|/(16|24))\n subnet_two_cidr:\n type: string\n description: \"The CIDR range for subnet two\"\n default: 10.0.1.0/24\n pattern: ([0-9]{1,3}\\.){3}[0-9]{1,3}($|/(16|24))\n", "createdAt": 1630393514.53, "description": "Version 1" } }
aws proton update-environment-template-version \ --region us-west-2 \ --template-name "public-vpc" \ --major-version "1" \ --minor-version "0" \ --status "PUBLISHED"
レスポンス例:
{ "environmentTemplateVersion": { "status": "PUBLISHED", "majorVersion": "1", "statusMessage": "", "minorVersion": "0", "recommendedMinorVersion": "0", "templateName": "public-vpc", "lastModifiedAt": 1630393667.876, "arn": "arn:aws:proton:us-west-2:123456789012:environment-template/public-vpc:1.0", "schema": "schema:\n format:\n openapi: \"3.0.0\"\n environment_input_type: \"PublicEnvironmentInput\"\n types:\n PublicEnvironmentInput:\n type: object\n description: \"Input properties for my environment\"\n properties:\n vpc_cidr:\n type: string\n description: \"This CIDR range for your VPC\"\n default: 10.0.0.0/16\n pattern: ([0-9]{1,3}\\.){3}[0-9]{1,3}($|/(16|24))\n subnet_one_cidr:\n type: string\n description: \"The CIDR range for subnet one\"\n default: 10.0.0.0/24\n pattern: ([0-9]{1,3}\\.){3}[0-9]{1,3}($|/(16|24))\n subnet_two_cidr:\n type: string\n description: \"The CIDR range for subnet two\"\n default: 10.0.1.0/24\n pattern: ([0-9]{1,3}\\.){3}[0-9]{1,3}($|/(16|24))\n", "createdAt": 1630393503.385, "description": "Version 1" } }
以上で環境テンプレートの登録、公開は完了です。
続いてサービステンプレートの登録をへ進みましょう。
Protonにサンプルのサービステンプレートを登録します。このサービステンプレートには、ロードバランサーの背後でECS Fargateサービスをプロビジョニングするために必要なすべてのリソースと、AWS CodeBuild/CodePipelineを使用した継続的デリバリーパイプラインが含まれています。実体は環境テンプレート同じくCloudFormationテンプレートです。
aws proton create-service-template \ --region us-west-2 \ --name "lb-fargate-service" \ --display-name "LoadbalancedFargateService" \ --description "Fargate Service with an Application Load Balancer"
レスポンス例:
{ "serviceTemplate": { "displayName": "LoadbalancedFargateService", "name": "lb-fargate-service", "lastModifiedAt": 1630393745.939, "arn": "arn:aws:proton:us-west-2:123456789012:service-template/lb-fargate-service", "createdAt": 1630393745.939, "description": "Fargate Service with an Application Load Balancer" } }
arn:aws:proton:us-west-2
について、オレゴン以外を利用している場合は、利用しているリージョンに置き換えてください。tar -zcvf svc-template.tar.gz service/ aws s3 cp svc-template.tar.gz s3://proton-cli-templates-${account_id}/svc-template.tar.gz --region us-west-2 rm svc-template.tar.gz aws proton create-service-template-version \ --region us-west-2 \ --template-name "lb-fargate-service" \ --description "Version 1" \ --source s3="{bucket=proton-cli-templates-${account_id},key=svc-template.tar.gz}" \ --compatible-environment-templates '[{"templateName":"public-vpc","majorVersion":"1"}]'
レスポンス例:
{ "serviceTemplateVersion": { "status": "REGISTRATION_IN_PROGRESS", "majorVersion": "1", "description": "Version 1", "templateName": "lb-fargate-service", "lastModifiedAt": 1630393809.611, "compatibleEnvironmentTemplates": [ { "majorVersion": "1", "templateName": "public-vpc" } ], "arn": "arn:aws:proton:us-west-2:123456789012:service-template/lb-fargate-service:1.0", "createdAt": 1630393809.611, "minorVersion": "0" } }
aws proton get-service-template-version \ --region us-west-2 \ --template-name "lb-fargate-service" \ --major-version "1" \ --minor-version "0"
レスポンス例:
{ "serviceTemplateVersion": { "status": "DRAFT", "majorVersion": "1", "statusMessage": "", "description": "Version 1", "templateName": "lb-fargate-service", "lastModifiedAt": 1630393811.759, "compatibleEnvironmentTemplates": [ { "majorVersion": "1", "templateName": "public-vpc" } ], "arn": "arn:aws:proton:us-west-2:123456789012:service-template/lb-fargate-service:1.0", "schema": "schema:\n format:\n openapi: \"3.0.0\"\n service_input_type: \"LoadBalancedServiceInput\"\n pipeline_input_type: \"PipelineInputs\"\n\n types:\n LoadBalancedServiceInput:\n type: object\n description: \"Input properties for a loadbalanced Fargate service\"\n properties:\n port:\n type: number\n description: \"The port to route traffic to\"\n default: 80\n minimum: 0\n maximum: 65535\n desired_count:\n type: number\n description: \"The default number of Fargate tasks you want running\"\n default: 1\n minimum: 1\n task_size:\n type: string\n description: \"The size of the task you want to run\"\n enum: [\"x-small\", \"small\", \"medium\", \"large\", \"x-large\"]\n default: \"x-small\"\n image:\n type: string\n description: \"The name/url of the container image\"\n default: \"public.ecr.aws/z9d2n7e1/nginx:1.21.0\"\n minLength: 1\n maxLength: 200\n\n PipelineInputs:\n type: object\n description: \"Pipeline input properties\"\n properties:\n dockerfile:\n type: string\n description: \"The location of the Dockerfile to build\"\n default: \"Dockerfile\"\n minLength: 1\n maxLength: 100\n unit_test_command:\n type: string\n description: \"The command to run to unit test the application code\"\n default: \"echo 'add your unit test command here'\"\n minLength: 1\n maxLength: 200\n environment_account_ids:\n type: string\n pattern: '^$|^\\d{12}(,\\d{12})*$'\n description: \"The environment account ids for service instances using cross account environment, separated by ,\"\n default: \"\"\n maxLength: 200\n", "createdAt": 1630393809.611, "minorVersion": "0" } }
※ --region us-west-2 について、オレゴン以外を利用している場合は、利用しているリージョンに置き換えてください。
aws proton update-service-template-version \ --region us-west-2 \ --template-name "lb-fargate-service" \ --major-version "1" \ --minor-version "0" \ --status "PUBLISHED"
レスポンス例:
{ "serviceTemplateVersion": { "status": "PUBLISHED", "majorVersion": "1", "statusMessage": "", "description": "Version 1", "recommendedMinorVersion": "0", "templateName": "lb-fargate-service", "lastModifiedAt": 1630393933.18, "compatibleEnvironmentTemplates": [ { "majorVersion": "1", "templateName": "public-vpc" } ], "arn": "arn:aws:proton:us-west-2:123456789012:service-template/lb-fargate-service:1.0", "schema": "schema:\n format:\n openapi: \"3.0.0\"\n service_input_type: \"LoadBalancedServiceInput\"\n pipeline_input_type: \"PipelineInputs\"\n\n types:\n LoadBalancedServiceInput:\n type: object\n description: \"Input properties for a loadbalanced Fargate service\"\n properties:\n port:\n type: number\n description: \"The port to route traffic to\"\n default: 80\n minimum: 0\n maximum: 65535\n desired_count:\n type: number\n description: \"The default number of Fargate tasks you want running\"\n default: 1\n minimum: 1\n task_size:\n type: string\n description: \"The size of the task you want to run\"\n enum: [\"x-small\", \"small\", \"medium\", \"large\", \"x-large\"]\n default: \"x-small\"\n image:\n type: string\n description: \"The name/url of the container image\"\n default: \"public.ecr.aws/z9d2n7e1/nginx:1.21.0\"\n minLength: 1\n maxLength: 200\n\n PipelineInputs:\n type: object\n description: \"Pipeline input properties\"\n properties:\n dockerfile:\n type: string\n description: \"The location of the Dockerfile to build\"\n default: \"Dockerfile\"\n minLength: 1\n maxLength: 100\n unit_test_command:\n type: string\n description: \"The command to run to unit test the application code\"\n default: \"echo 'add your unit test command here'\"\n minLength: 1\n maxLength: 200\n environment_account_ids:\n type: string\n pattern: '^$|^\\d{12}(,\\d{12})*$'\n description: \"The environment account ids for service instances using cross account environment, separated by ,\"\n default: \"\"\n maxLength: 200\n", "createdAt": 1630393816.137, "minorVersion": "0" } }
Protonに環境テンプレート、サービステンプレートが公開されました!
AWSマネージメントコンソールのProtonコンソールから環境テンプレート、サービステンプレートを確認してみましょう。
一連のオペレーションで登録した環境テンプレート、サービステンプレートの状態が確認できました。全て最新のマイナーバージョンが公開され、開発チームで利用可能となっています。
さっそく開発チームにProtonからアプリケーション実行環境とアプリケーションをデプロイしてもらいましょう!(ハンズオンではいずれも自分でやるのですが。。。)
Protonにサンプルの環境テンプレートを登録します。環境テンプレートは、VPC、サブネットなどアプリケーションの実行環境(本ハンズオンではECS Fargate)が稼働するために必要なインフラ構成を定義したCloudFormationテンプレートとなります。
本ハンズオンで利用するサンプルのテンプレートはECSクラスターと2つのパブリックサブネットを持つVPCで構成されています。
※Proton のアイコンでなく、nginx の画面が表示された場合は、CodePipeline の実行がまだ完了していない状態。CodePipeline の実行が完了すれば Proton のアイコンが表示されます。
下記の画面の場合はCodePiplelineの実行状況を確認しましょう。
以下の場合はまだ実行中の為、完了を待ってください。
Protonから構成したサービスは、CodeBuild/CodePipelineによる継続的デプロイパイプラインが作成されています。継続的デプロイパイプラインの動作を確認するため、アプリケーションのソースコードを変更し、変更されたアプリケーションがデプロイされるか試してみましょう。
以上でProtonを操作してアプリケーション実行環境を構成する手順は終了です。
インフラを意識せず、アプリケーション実行環境と継続的デプロイパイプラインが構成され、変更されたアプリケーションが継続的にデプロイされます。
これにより、開発チームがアプリケーション開発に集中できる環境を用意することができました。
ハンズオン終了後は、下記の手順で環境を片付けましょう。
※削除まで少し時間が掛かります
※画面を切り替える事で以下の画面になります
※削除まで少し時間が掛かります
対象バケットは以下の2種類
※例
・awsproton-yamaguchi-servi-pipelineartifactsbucket-159im6uyop51e
・proton-cli-templates-495911196177
※削除まで少し時間が掛かります
※デフォルトVPCを利用していた場合は削除不要
皆様お疲れ様でした。