使用AWS/GCP/Azure的PaaS来了解它们之间的特性差异
这篇文章是关于我离开之前的职位,在公司内部圣诞倒数日活动中写的一篇文章,主要总结了我在离开后学到的东西。
最近のクラウドではコンテナ/k8s対応やAI関連などのサービスが取り上げられることが多く、普通のWebアプリ開発のプラットフォームは落ち着いてきた感があります。とはいうもののこれからクラウドへの移行を検討しているという話もまだまだ多く聞きますので、運用負荷を減らすPaaS前提でクラウドの特徴をなるべく具体的に紹介したいと思います。
根据我的个人经验,我会根据客户和案件的不同选择使用多个云服务。
-
- AWS : チョットデキル
-
- GCP : チョットデキル
- Azure : 横目で見てた程度
希望安装的应用程序
我所指的是普通的网络应用开发。
-
- Java+SpringBootでの業務系Webアプリケーション(APIサーバでもよい)
LoadBalancer、冗長構成
ネットワーク設定
オートスケール
ログ参照
MySQLなどのDB
デモアプリのコードはこちらで公開しています。今回は作った環境ではDBの組み込みまでは入っていません。
https://github.com/nyasba/spring-integration-cloud-demo
細かいところまで手が届くAWS
在云服务中必然作为候选的是AWS。如果说PaaS的话,那就是在2011年发布的ElasticBeanstalk。
公式:https://aws.amazon.com/jp/elasticbeanstalk/
お客様はコードをアップロードするだけで、Elastic Beanstalk が、キャパシティーのプロビジョニング、ロードバランシング、Auto Scaling からアプリケーションの状態モニタリングまで、デプロイを自動的に処理します。同時に、お客様のアプリケーションが稼動している AWS リソースの完全なコントロールを維持でき、いつでも基本的なリソースにアクセスすることができます。
構成
アプリコードの修正
beanstalkにデプロイするアプリの準備です。デプロイ時はjarファイルおよび.ebextensions(任意)を使います。
.ebextensionsは立ち上げたインスタンス上でスクリプトを実行し、初期設定をする際などに使います。タイムゾーンや言語設定などでよく使われます。
build.gradleにzipタスクを追加しておくことで、デプロイ用のbuild/distribution/demo.zipを作成することができ、それを元にアプリを立ち上げることになります
task zip(type: Zip, dependsOn: jar) {
from ('etc/.ebextensions') {
into '.ebextensions'
}
from(jar.outputs.files){
into '.'
}
archiveName = "${project.name}.zip"
}
请参考以下链接查阅原始内容:
https://github.com/nyasba/spring-integration-cloud-demo/pull/1/files
在云端搭建应用环境
Beanstalkのメニューから上記のzipをアップロードすることで環境を立ち上げることが可能です。
我不会详细解释,但需要注意的地方大致在这里。
-
- セキュリティグループにてアクセス可能なIPを絞っておく
-
- APサーバの環境変数で SERVER_PORT=5000を設定する(Beanstalkはport5000でリクエストを受け付けるため)
- ELBを有効化
只需几分钟,环境就可以启动,点击URL即可访问该应用程序。
豆苗的设置
ここからもわかる通り、各構成要素でかなり細かい設定が可能です。
これは熟練者にとっては細かく制御できるのよいのですが、初心者にとっては何をどうすればいいかがわからないという問題があります。
CDパイプラインを設定する際はこれらをCode化して管理することになります。
初回は「環境の保存」というメニューから保存すると、S3バゲットelasticbeanstalk-ap-northeast-1-{アカウント番号}のresources/templates/{アプリケーション名}に出力されるものから始めると良いかと思います。
EnvironmentConfigurationMetadata:
DateCreated: '1544329847000'
DateModified: '1544329847000'
Platform:
PlatformArn: arn:aws:elasticbeanstalk:ap-northeast-1::platform/Java 8 running on 64bit Amazon Linux/2.7.7
OptionSettings:
AWSEBAutoScalingGroup.aws:autoscaling:asg:
MaxSize: '1'
aws:elasticbeanstalk:application:environment:
SERVER_PORT: '5000'
aws:elasticbeanstalk:cloudwatch:logs:
RetentionInDays: '3'
StreamLogs: true
aws:elasticbeanstalk:environment:
ServiceRole: aws-elasticbeanstalk-service-role
LoadBalancerType: application
aws:elasticbeanstalk:healthreporting:system:
SystemType: enhanced
aws:autoscaling:launchconfiguration:
SecurityGroups: defaultsg
IamInstanceProfile: aws-elasticbeanstalk-ec2-role
EnvironmentTier:
Type: Standard
Name: WebServer
AWSConfigurationTemplateVersion: 1.1.0.0
如果存在这个,可以通过eb create、eb deploy命令创建和更新环境。
部署会从头启动EC2,因此需要几分钟的时间(自动缩放也是一样的)。
Cloudformationとの関係
Beanstalkは実際のところ、AWSのリソースを設定ファイルから一括で作成・管理することができるCloudformationのラッパーです。Cloudformationのコンソールからも確認できます。
[增补] 最近,增加了CloudFormation的漂移检测功能。这是用于检测非CloudFormation更新的功能,进一步实现了基础设施即代码的彻底性。
Beanstalkの環境立ち上げでエラーとなった場合は、Cloudformationの機能にて管理しているリソースの状態がロールバックされます。エラー原因を特定したり、環境作成の状況を見るためにもこの画面は重宝しています。
ただし、管理対象のAWSのリソースは非常に細かく、ELBを追加するだけでも「ロードバランサー自体の設定」、「ELBのリスナー(接続先のAPサーバポートなど)の設定」など複数の設定が必要になります。そのため、AWSリソースの関係まで理解しないと使いこなせないというのが難点です。
请参考以下链接以查看可设置的项目:
https://docs.aws.amazon.com/zh_cn/elasticbeanstalk/latest/dg/command-options-general.html
与EC2的关系
您也可以从EC2菜单中查看信息,并且还可以通过菜单为实例分配固定IP等操作。(尽管不推荐)您可以像正常启动EC2实例时一样使用它。
日志
只需进行环境设置,即可实现以下输出。
-
- CloudwatchLogs
-
- S3への定期エクスポート(インスタンスが落ちる際にエクスポートするのは個別対処)
- X-ray
AWS概述
在使用上述的PaaS之前,必须理解AWS是由IaaS构成的背景,并理解其底层服务的结构和功能。换句话说,如果理解了底层,就可以在基础设施级别上解决问题,而不受平台约束,这是AWS最重要的特点之一。
如果你想做某件事,只要努力,就能做到,这也是AWS独有的特点。
只要入迷了,就变得强大的GCP,尽管他很坚毅。
自2008年起,出现了一种名为GoogleAppEngine(GAE)的PaaS服务。本次将介绍其Standard Environment(较旧版本)。
公式: https://cloud.google.com/appengine/?hl=ja
在开放的云平台上,可以开发最新的Web应用和移动应用,并且可以引入自己的语言运行环境、框架和第三方库。Google App Engine是一个完全抽象化的全管理平台,开发人员可以专注于编写代码。它可以从零开始无限扩展到全球规模,今天已被许多大型成功企业所利用。
构成
修改应用程式代码
由于GAE是基于Jetty运行的,所以我们需要去掉内嵌的Tomcat依赖,并添加ServletAPI。
此外,由于GAE无法通过控制台进行部署,我们将使用gradle-plugin来进行部署。
configurations {
// servletAPIを使うので組み込みtomcatをexclude
compile.exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
}
dependencies {
implementation('org.springframework.boot:spring-boot-starter-web')
testImplementation('org.springframework.boot:spring-boot-starter-test')
// GAE
implementation('com.google.appengine:appengine-api-1.0-sdk:+')
providedCompile('javax.servlet:javax.servlet-api:3.1.0')
}
appengine {
// local config ( dev_appserver )
run {
port = 8081
}
deploy {
stopPreviousVersion = true
promote = true
}
}
您可以使用以下命令在本地启动(端口:8081)。
./gradlew clean appengineRun
在云上部署应用环境
只需执行部署任务即可。
./gradlew clean appengineDeploy
在GCP中,您可以通过1分钟的时间完成部署。我们以”s 部署了默认服务,每个项目ID都会自动创建相应的终端节点。
部署的应用也以版本的概念进行管理,可以通过流量的切换实现蓝绿部署和金丝雀发布的功能。
descriptor: [/Users/..../demo/build/staged-app/app.yaml]
source: [/Users/..../demo/build/staged-app]
target project: [PROJECT_NAME]
target service: [default]
target version: [20181209t155241]
target url: [https://PROJECT_NAME.appspot.com]
Beginning deployment of service [default]...
#============================================================#
#= Uploading 130 files to Google Cloud Storage =#
#============================================================#
File upload done.
Updating service [default]...
...............done.
Setting traffic split for service [default]...
.......done.
Deployed service [default] to [https://PROJECT_NAME.appspot.com]
请参阅以下链接获取参考资料:
https://github.com/nyasba/spring-integration-cloud-demo/pull/2/files
限制和誓约
使用微服务的概念构建而成的GCP看起来使用方便,功能齐全。但要完全掌握其使用,需要与其约束条件相处得当。在自动扩展的前提下,有以下约束。
-
- リクエストは60秒以内
-
- アップロード可能なファイルサイズはMax32MB
インスタンスタイプのスペックが低い(F系)
インスタンスの起動時間が60秒を越えると起動失敗となる
通过设定这些限制,可以实现秒级的扩展,并且能够立即增加实例来处理突发性访问增加的请求。(我对接收请求后启动应用程序来处理请求的概念感到惊讶。根据语言的不同,似乎还可以进行毫秒级的扩展。)
然而,为了规避GoogleAppEngine的限制,还提供了一个名为FlexibleEnvironment的另一个环境。该环境基于Docker,可以部署环境,非常灵活,但仍有许多功能只能在标准环境中使用,令人苦恼。
因为只能从Standard将数据放入TaskQueue(因为接收方是http,所以可能)是最困扰的,但是由于CloudTasks作为一项新服务提供,我们希望将来会有期望的支持和等待。
https://cloud.google.com/blog/products/application-development/announcing-cloud-tasks-a-task-queue-service-for-app-engine-flex-and-second-generation-runtimes
日志
另外,Stackdriver非常出色,可以通过ErrorReporting查看异常时的日志,但唯一令人困扰的是无法从创建的自定义指标跳转到相应的日志,请尽快解决这个问题…
GCP总结
良いところを中心に紹介してきましたが、やはりGCPは起動が遅いJava言語とは相性がよいとは言えません。Spring Frameworkを使うことでさらにロードに時間がかかるため、ComponentScanの対象を絞るなどさらにコードに制約が発生します。
そのようなストイックな環境ですが、使いどころを見誤らなければ非常に使えるものではないかと感じています。最近はエンタープライズ向けに力を入れているようで、そういった機能が充実してくればもっと使えるものになってくるのではないかと期待しています。すぐにデプロイできてフィードバックループも早い開発プロセスが実現できるので、個人的には好きです。
平衡的的Azure
Azure的PaaS服务是AppService。
公式链接:https://azure.microsoft.com/ja-jp/services/app-service/
您可以使用高级企业级的网络应用程序、移动应用程序和API应用程序构建、部署和扩展在各种平台上运行的应用。使用完全托管的平台,您可以满足性能、可扩展性、安全性和合规性等严格要求,并进行基础设施维护。
-
- Windows/Linux環境に対応
-
- HotPoolのため、アプリのデプロイが早い
-
- ログはApplicationInsight
- (PaaSと関係ないけど)AzurePortalがつらい
虽然与GAE比较接近,但我感觉并没有太多限制,而且平衡感也很好。
(因为我经常被Portal权限问题困扰,所以还没碰过它。。)
参考:冷水池/热水池
-
- ColdPool : リソースが必要になったら環境を一から作る
- HotPool : アプリがデプロイできる環境は用意してあり、必要になったタイミングでデプロイのみ実施して提供する
AppService和GAE被归类为HotPool,而Beanstalk被归类为ColdPool。
请参考岡先生的资料以获取更详细的信息。
总结
针对将Spring的Web应用部署到云端这个问题,我整理了关于AWS(Beanstalk)、GCP(AppEngine)和Azure(AppService)的特点。作为Web应用的PaaS,任何云端都可以实现,因此在选择云端的时候,我认为理解其背后的功能、架构以及符合自己思维方式的因素非常重要。
这是一件不仅简单有趣的事情,也能让人通过触摸来理解其中的差异。而且,当有新的介绍时,我们可以从不同的角度来评价新功能,这使得它更有趣。如果这能成为一个契机,我将感到幸运。