C# 開発者必見、Docker コンテナへの継続的デプロイメント on AWS ~CodeCommit, CodeBuild, CodePipeline, CloudFormation, ECR, ECS を活用した CI/CD ~

Similar documents
サーバーレスアプリケーションのための CI/CD パイプライン構築 

Presentation Title Here

Startup_on_AWS_usecases_StartupDay

PowerPoint プレゼンテーション

AWS Deck Template

AWS のコンテナ管理入門(Amazon EC2 Conatainer Service)

PowerPoint Presentation

Red Hat OpenShift上でのInterstage Application Serverの動作手順(Java EE 7編)

Red Hat OpenShift上でのInterstage Application Serverの動作手順(Java EE 6編)

よくある問題を解決する~ 5 分でそのままつかえるソリューション by AWS ソリューションズビルダチーム

Docker/Kubernetes実践コンテナ開発入門

Oracle Un お問合せ : Oracle Data Integrator 11g: データ統合設定と管理 期間 ( 標準日数 ):5 コースの概要 Oracle Data Integratorは すべてのデータ統合要件 ( 大量の高パフォーマンス バッチ ローブンの統合プロセスおよ

_DockerとAmazon_ECSでDevOpsを進化させる_public

PowerPoint プレゼンテーション

Presentation Title Here

Oracle SQL Developer Data Modeler

VMware vcloud Suite

AWS Mobile Deep Dive - 入門から実践までの最短コース 〜 ライブコーディングで学ぶ AWS を活用したモバイルアプリの開発 〜

TeX LiveのCIテスティング

ASP.NET 5 Web 開発 ~ フレームワーク編 ~

FUJITSU Cloud Service for OSS 「コンテナサービス」 ご紹介資料

PowerPoint Presentation

目次 はじめに 4 概要 4 背景 4 対象 5 スケジュール 5 目標点 6 使用機材 6 第 1 章 C# 言語 7 C# 言語の歴史 7 基本構文 8 C 言語との違い 9 Java 言語との違い 10.Netフレームワーク 10 開発資料 10 第 2 章 Mono 11 Monoの歴史 1

Slide 1

JavaもJava Scriptも! コンテナ型アプリケーション開発PaaS登場

Visual Studio with Cordova クロスプラットフォーム開発の全貌

Install / Protect / Monetize InstallShield 全機能 データシート プロフェッショナルなインストールの作成 PREMIER PROFESSIONAL EXPRESS MSIX パッケージ サポート フレームワークをサポート Windows Installer(

【AWS Tech 再演】Amazon EC2 Systems Manager によるハイブリッド環境の管理

PowerPoint プレゼンテーション

Red Hat Enterprise Linuxのcron(8)デーモンにデフォルト定義されたtmpwatch命令の動作による、WebOTXのトラブル対処方法

AWS における ベストパートナーを見つける 7 つの方法 相澤恵奏アマゾンウェブサービスジャパンアライアンス技術本部テクニカルイネーブルメント部部長パートナーソリューションアーキテクト #AWSInnovate 2019, Amazon Web Services, Inc. or its affi

28th Embarcadero Developer Camp

サーバレスで王道 Web フレームワークを使う方法

AWS セキュリティ入門

2. Docker の基本的な操作 1 docker hub の参照 2 DockerHub の Explorer リンクからアプリケーションを参照 3 アプリケーション検索 4 tag について 3. docker 基本コマンド 1 docker の

SIOS Protection Suite for Linux v9.3.2 AWS Direct Connect 接続クイックスタートガイド 2019 年 4 月

データベースの近代化:シンプルなクロスプラットフォーム、最小のダウンタイムで実現するクラウド移行

ナビタイムサービスにおける、Amazon ECS を活用したシステム移行 ~『乗換NAVITIME』での移行事例 ~

タイトルを1~2行で入力 (長文の場合はフォントサイズを縮小)

スライド 1

AWS Well-Architected フレームワークによるクラウド ベスト プラクティス

PowerPoint プレゼンテーション

クラウドネイティブにセキュリティを 活用する!API を連携して実装する方法

Oracle Cloud Adapter for Oracle RightNow Cloud Service

Congress Deep Dive

Oracle SQL Developerの移行機能を使用したOracle Databaseへの移行

Graph APIでインターナルアプリケーションを開発

WEBシステムのセキュリティ技術

Cisco Unified Communications Manager サーバ アドレスとユーザ名の自動的な入力

一般社団法人ビジネス機械・情報システム産業協会

クックパッドのテスト自動化

目次 1. はじめに 本書対象者 PALRO のアプリケーションについて Ubuntu 8.04LTS の入手について Linux 上での開発環境の構築 事前準備 Ubuntu のインストール..

Oracle SOA Suite 11gコンポジットに対するSOASchedulerの構成

Web AppBuilder for ArcGIS (Developer Edition) インストールガイド

Oracle Solaris 仮想環境とプロビジョン環境の構築

WebアプリケーションサーバJBoss入門

ServerViewのWebアクセス制限方法

インテル(R) Visual Fortran コンパイラ 10.0

aws_summit_abematv_fresh

GitLab + Dokku で作る CI/ CD 環境 Kazuhiro NISHIYAMA 第 78 回 Ruby 関西勉強会 2017/07/29 Powered by Rabbit 2.2.0

ER/Studio Data Architect 2016 の新機能

Docker Enterprise EditionではじめるCaaS

新サービス「Azure App Service」で変わる新しい Web/モバイル アプリケーション開発

JP-2-Develop Websites and Components in AEM v6x_(V3_after QA)_1111

10th Developer Camp - B5

Automation for Everyone <デモ で実感できる、組織全体で活用できるAnsible Tower>

MATLAB® における並列・分散コンピューティング ~ Parallel Computing Toolbox™ & MATLAB Distributed Computing Server™ ~

Docker 入門

ASP.NET 5 Web 開発 ~ ランタイム編 ~

PowerPoint Presentation

利用者

Transcription:

T H A N K S T O O U R F R I E N D S A T :

C# 開発者必見 Docker コンテナへの 継続的デプロイメント on AWS ~CodeCommit, CodeBuild, CodePipeline, CloudFormation, ECR, ECS を活用した CI/CD ~ アマゾンウェブサービスジャパン株式会社 ソリューションアーキテクト 福井厚 2017/05/31 2016, Amazon Web Services, Inc. or its Affiliates. All rights reserved.

本セッションの Feedback をお願いします 受付でお配りしたアンケートに本セッションの満足度やご感想などをご記入くださいアンケートをご提出いただきました方には もれなく素敵な AWS オリジナルグッズをプレゼントさせていただきます アンケートは各会場出口 パミール 3F の EXPO 展示会場内にて回収させて頂きます

自己紹介 名前 所属 前職 福井厚 ( ふくいあつし )fatsushi@ アマゾンウェブサービスジャパン株式会社 技術統括本部エンタープライズソリューション部 ソリューションアーキテクト エンタープライズアプリケーション開発コンサルタント 好きな AWS サービス AWS Code シリーズ AWS IoT AWS Lambda(C#)

アジェンダ エンタープライズを取り巻く環境 なぜ継続的デプロイメントなのか? C# と.NET Core Dockerコンテナの活用 コンテナと共にCI/CDを実現するAWSサービス ASP.NET Core アプリの継続的デプロイメント on AWS まとめ

エンタープライズを取り巻く環境

15 年 大型株銘柄の企業の平均寿命 1920 年代の 67 年から現在は 15 年に低下してきている 2/3 2/3 以上の IT 予算は現在の運用を維持することに使われている 77% の CEO はここ数年でセキュリティリスクが増加しており 65% の CEO はリスク管理の能力が遅れを取っていると感じている

これらがどのように影響するか 必要なリソースもなく競合優位性を維持するためのクリティカルなビジネスイニシアチブを追求ことが要求される 伝統的な IT モデルは革新的なスタートアップと同じペースを維持するために必要なアジリティに欠けている 不十分なセキュリティ コンプライアンス 可用性は不正な攻撃に対する洗練された対策を実施する能力を妨げる

要求に対応する新しいモデル 企業としての差別化にフォーカス スタートアップのようなスピードで革新する リスクを低減する

差別化にフォーカスする かつ技術的負債を低減する

コアミッションにフォーカスする インフラストラクチャに割く時間を低下させる 新しいビジネスの主導権獲得に集中する 革新に対してより多くのリソースを投入する

かつてないほど速く革新する ソフトウェア開発のアジリティーを高める

ソフトウェアの動きは加速している ソフトウェアの作成と配布はかつてないほど簡単で高速になっている : ほとんどあるいはまったく資金調達せずに中小企業が巨大企業に対抗できる ダウンロードひとつで数百万人のユーザーにすぐにソフトウェアを配布できる 混乱を抑制するには機敏性が最も重要

ソフトウェア配布モデルは大きく様変わりしている かつてのソフトウェア配布モデル 新しいソフトウェア配布モデル エンタープライズアプリケーションでも頻繁なアップデートが求められる

インフラストラクチャのリスクを削減

Move Fast OR Stay Secure

Move Fast AND Stay Secure

なぜ継続的デプロイメントなのか?

ビジネスアプリケーションもサービス指向に 複雑でモノリシックなシステムに対するメンテナンスの限界 機能要求に対するリリース期間の短縮が命題 業務システムへのシングルページアプリケーション (SPA) の導入 Web API によるサービス化 マイクロサービス志向 サービス単位に並列でチーム開発

アジャイルな開発に必要なツールとは? この新しいソフトウェア駆動の世界でソフトウェアをリリースするのに必要なツール ソフトウェア開発のリリースプロセスの流れを管理するツール コードの不具合や潜在的な問題をテスト / 検査するツール アプリケーションをデプロイするツール

リリースプロセスのレベル ソースビルドテスト運用 継続的インテグレーション 継続的デリバリ 継続的デプロイメント

継続的デプロイメントのメリット ソフトウェアの 開発者の バグをすばやく アップデートの リリースプロセスを 生産性を改善 検出して対処 配信を高速化 自動化

C# と.NET Core

C# ( ウィキペディアより ) マルチパラダイムプログラミング言語 強い型付け 命令型 宣言型 手続き型 関数型 ジェネリック オブジェクト指向の要素を持つ.NET Framework とともに作られ Ecma International および国際標準化機構 (ISO) によって標準化 日本においても日本工業規格 (JIS) によって採択 多くの魅力的な言語仕様.NET の豊富なクラスライブラリ エンタープライズ系アプリケーションでの利用 特に Windows 開発者の多くが利用

C# - 多くの魅力的な言語仕様 プロパティ デリゲート 属性 Generics イテレータ パーシャル型 Nullable 型 暗黙的型付け 拡張メソッド ラムダ式 初期化子 匿名型 暗黙的型付け配列 LINQ 自動プロパティ パーシャルメソッド 動的型付け変数 オプション引数 名前付き引数 非同期処理 Null 条件演算子 文字列挿入 nameof 演算子 インデックス初期化子 タプル 型スイッチ

.NET Core クロスプラットフォーム Windows Linux Mac で実行可能 Linux 上の Docker コンテナで動作可能 統合標準ライブラリ 高速 軽量 Docker イメージのビルドも高速 モダン オープンソース

.NET Core の便利なライブラリ.NET Standard Library ASP.NET Core MVC ASP.NET Core Web API Entity Framework More

C# と.NET Core とプラットフォームの関係.NET Core 上のアプリはマルチプラットフォームで動作 Your Apps Your Apps Your Apps Your Apps Your Apps C# / VB / F#... Legacy Library Standard Library.NET Framework.NET Core Widows Linux OSX

AWS と.NET Core 様々なプラットフォームで動作 Amazon EC2 Windows Amazon EC2 Linux Amazon ECS AWS Lambda Amazon EC2 Windows Amazon EC2 Linux Amazon ECS AWS Lambda

Docker コンテナの活用

なぜ Docker コンテナなのか? 詳細は去年の AWS Developer Conference の下記のセッションをご参照ください Docker と Amazon ECS で DevOps を進化させる 動画 : https://www.youtube.com/watch?v=3oc98vt-uy0 スライド : http://media.amazonwebservices.com/jp/summit2016 /3Dev-T04.pdf

デプロイメントの課題 開発環境の構成のメンテナンスが必要 開発 テスト 本番で環境に差異がある Source Build Test Production Provision Config Application Artifact なるほど 全てが必要なんですね テストの需要がバラバラで管理が大変 オートスケールやノード障害対応

Docker を取り入れたデプロイメント イメージがバージョン Source Build Test Production Provision Config 環境に差異がない 同じ成果物をテストしてデプロイ Application Image コードだけ書いていればいい!

コンテナと共に CI/CD を実現する AWS サービス

AWS Code シリーズ AWS CodeStar AWS CodePipeline AWS CodeDeploy AWS CodeCommit AWS CodeBuild

Amazon CloudFormation 設定管理 & クラウドのオーケストレーションサービス スタック テンプレート ( 設定ファイル ) EC2 テンプレートに基づき各リソースが自動起動 Cloud Formation EC2 Auto Scaling 環境を自動構築 テンプレートを元に EC2 や ELB といった AWS リソースの環境構築を自動化 JSON または YAML のテキストでテンプレートを自由に記述可能 豊富なリファレンス Microsoft Windows Server や SAP HANA などのリファレンス実装を用意

Amazon EC2 Container Service コンテナ管理をあらゆるスケールで 柔軟なコンテナの配置 AWS の基盤との連携

Amazon EC2 Container Service フルマネージドで使える Docker レジストリサービス 完全マネージド型 安全性 高い可用性 シンプルなワーク フロー

ASP.NET Core アプリの 継続的デプロイメント on AWS

アジェンダ ECS Reference Architecture: Continuous Deployment 継続的デプロイメントの構成 パイプラインの設定 Demo: 継続的デプロイメント まとめ

ECS Reference Architecture: Continuous Deployment AWS CodePipeline, AWS CodeBuild, Amazon ECR, AWS CloudFormation を利用した Amazon ECS への継続的デプロイメント を参照 https://aws.amazon.com/jp/blogs/news/continuousdeployment-to-amazon-ecs-using-aws-codepipelineaws-codebuild-amazon-ecr-and-aws-cloudformation/ 上記の記事をベースに ASP.NET Core アプリに対して継続的デプロイメント環境を構築

継続的デプロイメントの構成 CodeBuild が Docker イメージをビルドし ECR へプッシュ git push でリポジトリを更新 CodePipeline が更新を検知しパイプラインを開始 AWS CodeBuild Amazon ECR CloudFormation が ECR の Docker イメージを ECS クラスタに展開 Developers AWS CodeCommit AWS CodePipeline AWS CloudFormation Amazon ECS

環境はすべて CloudFormation で構築 vpc.yaml Amazon VPC ecs-refarch-continuousdeployment.yaml load-balancer.yaml Application Load Balancer このテンプレートを実行するだけ Ecs-cluster.yaml Amazon ECS deployment-pipeline.yaml AWS CodePipeline service.yaml

CodePipeline パイプライン ソース AWS CodeCommit をリポジトリとして利用し git push の実行でソースの更新を検知しパイプラインの実行を開始 Amazon ECS のサービスを作成 更新する AWS CloudFormation テンプレートを S3 バケットに保存 ビルド AWS CodeBuild を利用し ASP.NET Core の Docker イメージを作成 Amazon ECR に登録 デプロイ AWS CloudFormation を利用し Amazon ECS のサービスを作成 更新

Tips: CodeCommit の HTTPS 接続と認証の手順 1. AWS CodeCommit にアクセスする IAM User を作成 2. IAM User に CodeCommit 用のユーザー名とパスワードを生成 3. 生成した認証情報を Git の HTTPS 接続時にユーザー名 パスワード認証で利用 4. IDE からの接続も同様 AWS CodeCommit は Git version 1.7.9 以上をサポート 46

パイプラインの設定 Source AWS CodeCommit Amazon S3 ecs-refarch-continuousdeployment.yaml Build Dockerfile Docker Image Docker Image AWS CodePipeline AWS CodeBuild Amazon ECR Amazon ECS Deploy deployment-pipeline.yaml AWS CloudFormation service.yaml

パイプラインの設定 Source AWS CodeCommit Amazon S3 ecs-refarch-continuousdeployment.yaml Build Dockerfile Docker Image Docker Image AWS CodePipeline AWS CodeBuild Amazon ECR Amazon ECS Deploy deployment-pipeline.yaml AWS CloudFormation service.yaml

CodePipeline Build の設定 CodeBuildProject: Type: AWS::CodeBuild::Project Properties: Artifacts: Location:!Ref ArtifactBucket Type: "S3" Source: Location:!Sub ${ArtifactBucket}/source.zip Type: "S3" BuildSpec: version: 0.1 phases: pre_build: commands: - echo -n "$CODEBUILD_BUILD_ID" sed "s/.*: ([[:xdigit:]] {7 } ).*/ 1/" > /tmp/build_id.out - printf "%s:%s" "$REPOSITORY_URI" "$(cat /tmp/build_id.out)" > /tmp/build_tag.out - printf '{"tag":"%s"}' "$(cat /tmp/build_id.out)" > /tmp/build.json - $(aws ecr get-login) Source ステージで CodeCommit リポジトリから取得した S3 バケット上の Zip を指定 CodeBuild 環境で実行するコマンドを指定 CodeBuild がセットする $CODEBUILD_BUILD_ID 環境変数でビルド ID を取得ここではビルド ID から 7 桁の 16 進数を抜き出してタグとして利用 $ REPOSITORY_URI には ECR の URL aws ecr get-login の戻り値を実行することで ECR へのアクセスが可能... 続く

CodePipeline Build の設定... 続き build: commands: - docker build --tag "$(cat /tmp/build_tag.out)". post_build: commands: - docker push "$(cat /tmp/build_tag.out)" artifacts: files: /tmp/build.json discard-paths: yes Environment: ComputeType: "BUILD_GENERAL1_SMALL" Image: "aws/codebuild/docker:1.12.1" Type: "LINUX_CONTAINER" EnvironmentVariables: - Name: AWS_DEFAULT_REGION Value:!Ref AWS::Region - Name: REPOSITORY_URI Value:!Sub ${AWS::AccountId}.dkr.ecr.${AWS::Region}.amazonaws.com/${Repository} Name:!Ref AWS::StackName ServiceRole:!Ref CodeBuildServiceRole CodeBuild の build フェーズで docker build を実行 CodeBuild の post_build フェーズで ECR に push CodeBuild へ渡す環境変数を指定 $REPOSITORY_URI には ECR の URL を指定

パイプラインの設定 Source AWS CodeCommit Amazon S3 ecs-refarch-continuousdeployment.yaml Build Dockerfile Docker Image Docker Image AWS CodePipeline AWS CodeBuild Amazon ECR Amazon ECS Deploy deployment-pipeline.yaml AWS CloudFormation service.yaml

DockerFile ASP.NET Core の Docker イメージ FROM microsoft/aspnetcore-build:1.1 WORKDIR /app ポート80を公開 EXPOSE 80 C# プロジェクトソースのコピー COPY. /app RUN ["dotnet", "restore"] RUN ["dotnet", "build"] RUN ["dotnet", "ef", "database", "update"] RUN ["dotnet", "publish", "-o", "./out/"] ENTRYPOINT ["dotnet", "./out/awsaspnetcoredemo.dll"] ビルドと配置 ASP.NET Core Web アプリの起動

パイプラインの設定 Source AWS CodeCommit Amazon S3 ecs-refarch-continuousdeployment.yaml Build Dockerfile Docker Image Docker Image AWS CodePipeline AWS CodeBuild Amazon ECR Amazon ECS Deploy deployment-pipeline.yaml AWS CloudFormation service.yaml

CodePipeline Deploy の設定 - Name: Deploy Actions: - Name: Deploy ActionTypeId: Category: Deploy Owner: AWS DeployステージではCloudFormationを利用 Version: 1 Provider: CloudFormation CloudFormationスタックの作成または更新 Configuration: を指定 ChangeSetName: Deploy ActionMode: CREATE_UPDATE StackName:!Sub "${AWS::StackName}-Service" Capabilities: CAPABILITY_NAMED_IAM TemplatePath: Template::templates/service.yaml RoleArn:!GetAtt CloudFormationExecutionRole.Arn... 続く CloudFormation スタックテンプレートの指定

CodePipeline Deploy の設定... 続き ParameterOverrides:!Sub { } "Tag" : { "Fn::GetParam" : [ "BuildOutput", "build.json", "tag" ] }, "DesiredCount": "1", "Cluster": "${Cluster}", "TargetGroup": "${TargetGroup}", "Repository": "${Repository}" InputArtifacts: - Name: Template - Name: BuildOutput RunOrder: 1 CloudFormation テンプレートパラメータのオーバーライド Build ステージの成果物から値を取得

パイプラインの設定 Source AWS CodeCommit Amazon S3 ecs-refarch-continuousdeployment.yaml Build Dockerfile Docker Image Docker Image AWS CodePipeline AWS CodeBuild Amazon ECR Amazon ECS Deploy deployment-pipeline.yaml AWS CloudFormation service.yaml

CloudFormation: Service.yaml Service: Type: AWS::ECS::Service Properties: Cluster:!Ref Cluster Role:!Ref ECSServiceRole DesiredCount:!Ref DesiredCount TaskDefinition:!Ref TaskDefinition LoadBalancers: - ContainerName: aspnetcore-app ContainerPort: 80 TargetGroupArn:!Ref TargetGroup ECS タスク定義 コンテナのポートとターゲットグループの指定... 続く

CloudFormation: Service.yaml... 続き TaskDefinition: Type: AWS::ECS::TaskDefinition Properties: Family:!Sub ${AWS::StackName}-aspnetcore-app ContainerDefinitions: - Name: aspnetcore-app Docker イメージの指定 Image:!Sub ${AWS::AccountId}.dkr.ecr.${AWS::Region}.amazonaws.com/${Repository}:${Tag} Cpu: 512 Essential: true Memory: 512 PortMappings: - ContainerPort: 80 Environment: - Name: Tag Value:!Ref Tag リソースの指定

Demo: 継続的デプロイメント

まとめ

まとめ C# はエンタープライズ開発に最適な開発言語.NET Core は軽量 高速 マルチプラットフォーム 継続的インテグレーション / 継続的デプロイメントで開発生産性を向上 Docker の導入で開発環境から本番環境まで一貫性を保つ CI/CD を実現する AWS の各サービスをうまく利用することで価値ある作業に集中する

関連セッション 2017/5/31 17:20 ~ 18:00 プリンスホール D2T7-6(Dev D2T7-6Day トラック 1) Amazon ECS の進化 DevOps と Microservices の実践 2017/6/1 13:20 ~ 14:00 プリンスホール D3T7-2(Dev Day トラック 1) DevSecOps on AWS - Policy in Code 2017/6/2 17:20 ~ 18:00 国際館パミール 3F D4T2-6(AWS Tech トラック 2) AWS マネージドサービスで実現する CI/CD パイプライン

Don t Forget Evaluations! アンケートにご記入をお願いします

Thank You! ご清聴ありがとうございました