“AWS CodeDeploy”的版本间的差异

来自Gea-Suan Lin's Wiki
跳到导航 跳到搜索
發起端
外部機器
第103行: 第103行:
 
$ chmod 755 install
 
$ chmod 755 install
 
$ sudo ./install auto
 
$ sudo ./install auto
 +
</syntaxhighlight>
 +
 +
如果是在某些有提供<code>http://169.254.169.254/</code>服務的VPS上執行(像是Vultr),會有<code>Amazon EC2 instances are not supported.</code>這類的錯誤訊息,這時候就需要用iptables暫時性擋掉對169.254.169.254的Port 80連線了。理論上用這個指令在重開後就會失效,對其他應用程式比較不會有副作用:
 +
 +
<syntaxhighlight lang="shell-session">
 +
$ sudo iptables -I OUTPUT -d 169.254.169.254 -p tcp --dport 80 -j DROP
 
</syntaxhighlight>
 
</syntaxhighlight>
  

2018年5月31日 (四) 23:31的版本

AWS CodeDeployAWS提供的服务之一,用于发布伺服器端的软体。

简介

AWS CodeDeploy是一套伺服器软体布署的服务,跟其他软体布署不同的点主要在于:

  • SSH由外部连入更新,是由伺服器端主动取得档案并且布署。

这点在云端时代特别重要。布署发起人不容易知道现在线上有哪些机器,甚至有可能在开新机器时(如Auto Scaling)有race condition,而导致布署发起人不知道有新机器需要布署。

安装

在伺服器端需要安装Agent,这只Agent会负责取得档案并且执行设定的步骤[1]。以Ubuntu的环境为例子来说[2],会需要先安装Ruby 2.0(在14.04下)或Ruby 2.3(在16.04下)后,取得安装设定档执行:

$ sudo apt install ruby2.3
$ cd /tmp
$ wget https://aws-codedeploy-us-east-1.s3.amazonaws.com/latest/install
$ chmod 755 install
$ sudo ./install auto

在非EC2的机器上可能会跑比较久(需要等169.254.169.254的timeout,在EC2上时这个IP会有HTTP服务提供资讯给Instance)。

然后看Agent是否有启动:

$ sudo service codedeploy-agent status

如果没有的话可以用start启动:

$ sudo service codedeploy-agent start

设定

软体本身有两段设定,一段是Deploy的发起端透过awscli呼叫,另外一段是在appspec.yml定义在伺服器上的行为。

发起端

通常会有两个指令:

  • 将现在的目录打包起来传到S3上。可能会使用--ignore-hidden-files避免.git或是.svn被包进去,但这个方式会使得.htaccess不会被包进去,对于使用Apache的使用者来说要注意。
  • 要求CodeDeploy送指令到各机器上抓档案。
$ export NOW=$(date -u +%Y%m%d-%H%M%S)
$ export S3_KEY=${APPLICATION_NAME}/${GIT_BRANCH}-${NOW}-${GIT_HASH}
$ aws deploy push \
  --application-name "${APPLICATION_NAME}" \
  --profile "${AWS_PROFILE}" \
  --region "${AWS_REGION}" \
  --s3-location "s3://${S3_BUCKET}/${S3_KEY}"
$ aws deploy create-deployment \
  --application-name "${APPLICATION_NAME}" \
  --deployment-group-name "${GIT_BRANCH}" \
  --profile "${AWS_PROFILE}" \
  --region "${AWS_REGION}" \
  --s3-location bucket="${S3_BUCKET},key=${S3_KEY},bundleType=zip"

这边可以看到故意放一些资讯到档案名称上,让后续维护起来(找问题时)比较轻松。

伺服器端

appspec.xml内最简单的设定就是指定要将这包档案解到哪边:

version: 0.0
os: linux
files:
  - source: /
    destination: /srv/www.example.com

外部机器

当机器不在EC2上时,有几种方法可以注册到CodeDeploy的系统上,会被称为On-Premises Instance。这边我们介绍的方法是一台机器给一个IAM user的方式。

首先先在一般的机器上产生出对应的权限与设定档(不需要在需要注册的机器上),因为要建立IAM权限,通常会是由管理员建立(有AdministratorAccess的人):

$ aws deploy register --instance-name api-example-1 --region us-east-1

然后把生出的.yml档案传到要注册的机器上:

$ scp codedeploy.onpremises.yml api-example-1:/tmp/

然后在要注册的机器上执行aws deploy install

$ cd /tmp
$ sudo aws deploy install --config-file codedeploy.onpremises.yml --region us-east-1

上面的指令目前会因为他想装ruby2.0但系统没有而烂掉,我们只是要他把设定档塞进系统。(因为只有Ubuntu 14.04有ruby2.0,在16.04因为没这个套件而需要用ruby2.3替代,但aws deploy install还是写死ruby2.0,而这个问题被提出来很久了,看起来官方懒得修...)

请照更上面提到的方式改装us-east-1install档案即可(这边的指令与上面是一样的,为了方便这边复制一份过来):

$ sudo apt install ruby2.3
$ cd /tmp
$ wget https://aws-codedeploy-us-east-1.s3.amazonaws.com/latest/install
$ chmod 755 install
$ sudo ./install auto

如果是在某些有提供http://169.254.169.254/服务的VPS上执行(像是Vultr),会有Amazon EC2 instances are not supported.这类的错误讯息,这时候就需要用iptables暂时性挡掉对169.254.169.254的Port 80连线了。理论上用这个指令在重开后就会失效,对其他应用程式比较不会有副作用:

$ sudo iptables -I OUTPUT -d 169.254.169.254 -p tcp --dport 80 -j DROP

都跑起来后(建议直接重开机测试)要记得加上Tag让后续设定可以抓到机器。

参考资料

外部连结