techpivot / aws-code-deploy
AWS Code Deploy Bash Runner
README
此脚本使用AWS Code Deploy服务部署应用程序。脚本使用AWS CLI进行底层命令,并扩展功能以满足部署应用程序的常见需求,包括压缩、加密、存储桶版本限制、监控等。它还可以根据需要创建定义的AWS Code Deploy组件(例如,部署组)。通过利用环境变量,此脚本易于移植,旨在在CI容器内运行。有关更多信息,请参阅AWS Code Deploy文档或AWS CLI API。
功能
- 一个依赖项:AWS CLI(如果不可用,则自动安装)
- 自动压缩源目录
- 能够通过键前缀限制存储的版本数量,以帮助减少S3的总文件大小
- 版本的服务器端加密
- 从失败实例提供完整的诊断输出
示例输出
Step 1: Checking Dependencies ✔ Dependencies met (aws: aws-cli/1.8.12 Python/2.7.6 Linux/3.14.28-031428-generic). Step 2: Configuring AWS ✔ AWS Access Key already configured. ✔ AWS Secret Access Key already configured. ✔ Successfully configured AWS default region. Step 3: Checking Application ➜ aws deploy get-application --application-name TechPivot ✔ Application "TechPivot" already exists Step 4: Checking Deployment Config ➜ aws deploy get-deployment-config --deployment-config-name CodeDeployDefault.AllAtOnce ✔ Deployment config "CodeDeployDefault.AllAtOnce" already exists Step 5: Checking Deployment Group ➜ aws deploy get-deployment-group --application-name TechPivot --deployment-group-name www.techpivot.net ✔ Deployment group "www.techpivot.net" already exists for application "TechPivot" Step 6: Compressing Source Contents ➜ cd "/home/ubuntu/deploy" && zip -rq "/tmp/729#a4d2fa4.zip" . ✔ Successfully compressed "/home/ubuntu/deploy" (57M) into "729#a4d2fa4.zip" (18M) Step 7: Copying Bundle to S3 ➜ aws s3 cp --sse "/tmp/729#a4d2fa4.zip" "s3://techpivot-codedeploy/www/729#a4d2fa4.zip" ✔ Successfully copied bundle "729#a4d2fa4.zip" to S3 Step 8: Limiting Deploy Revisions per Bucket/Key Checking bucket/key to limit total revisions at 10 files ... ➜ aws s3 ls "s3://techpivot-codedeploy/www/" Removing oldest 1 file(s) ... ➜ aws s3 rm "s3://techpivot-codedeploy/www/713#1ef9317.zip" ✔ Successfuly removed 1 file(s) Step 9: Registering Revision ➜ aws deploy register-application-revision --application-name "TechPivot" --s3-location bucket=techpivot-codedeploy,bundleType=zip,key=www/729#a4d2fa4.zip --description "master (#a4d2fa4)" ✔ Registering revision succeeded Step 10: Creating Deployment ➜ aws deploy create-deployment --application-name TechPivot --deployment-config-name CodeDeployDefault.AllAtOnce --deployment-group-name www.techpivot.net --s3-location bucket=techpivot-codedeploy,bundleType=zip,key=www/729#a4d2fa4.zip --description "Deployed via CircleCI on Sun Nov 8 23:32:30 UTC 2015" ✔ Successfully created deployment: "d-CDR1HA75C" Note: You can follow your deployment at: https://console.aws.amazon.com/codedeploy/home#/deployments/d-CDR1HA75C Deployment Overview Monitoring deployment "d-CDR1HA75C" for "TechPivot" on deployment group www.techpivot.net ... ➜ aws deploy get-deployment --deployment-id "d-CDR1HA75C" Status | In Progress: 0 | Pending: 0 | Skipped: 0 | Succeeded: 1 | Failed: 0 | ✔ Deployment of application "TechPivot" on deployment group "www.techpivot.net" succeeded
用法
Composer(PHP项目)
-
将Packagist中的
techpivot/aws-code-deploy
项目作为开发依赖项包含进来composer.json
"require-dev" : { "techpivot/aws-code-deploy": "~1.0" }
或通过命令行
composer require --dev techpivot/aws-code-deploy ~1.0
-
然后可以直接执行文件:
./vendor/bin/aws-code-deploy.sh
NPM(通用项目)
将NPM中的aws-code-deploy
作为本地或全局依赖项包含进来。
全局
npm install aws-code-deploy -g
- 然后可以在全局范围内执行文件:
aws-code-deploy
本地
npm install aws-code-deploy --save-dev
- 然后可以直接执行文件:
./node_modules/aws-code-deploy/bin/aws-code-deploy.sh
环境变量
环境变量用于控制部署操作。以下是简要摘要。完整的描述和建议可以通过在README中搜索变量名称找到。
示例
CircleCI
circle.yml
machine:
environment:
# We are defining the $AWS_CODE_DEPLOY_KEY and $AWS_CODE_DEPLOY_SECRET in the CircleCI Project Settings >
# AWS Permissions which automatically configure these for use via aws cli and are automatically read
# via aws-code-deploy.sh. Alternatively, these could be specified securely (not via project code) using
# the CircleCI Environment Variables CircleCI control panel.
AWS_CODE_DEPLOY_REGION: us-west-2
AWS_CODE_DEPLOY_APPLICATION_NAME: "Company Website"
AWS_CODE_DEPLOY_DEPLOYMENT_CONFIG_NAME: CodeDeployDefault.AllAtOnce
AWS_CODE_DEPLOY_DEPLOYMENT_GROUP_NAME: "www.my-company.com"
AWS_CODE_DEPLOY_SERVICE_ROLE_ARN: "arn:aws:iam::XXXXXXXXXXXXX:role/my-company-codedeploy"
AWS_CODE_DEPLOY_EC2_TAG_FILTERS: "Key=Type,Value=www,Type=KEY_AND_VALUE"
AWS_CODE_DEPLOY_APP_SOURCE: $HOME/deploy
AWS_CODE_DEPLOY_S3_FILENAME: "${CIRCLE_BUILD_NUM}#${CIRCLE_SHA1:0:7}.zip"
AWS_CODE_DEPLOY_S3_BUCKET: my-company-codedeploy-us-west-2
AWS_CODE_DEPLOY_S3_KEY_PREFIX: /www
AWS_CODE_DEPLOY_S3_LIMIT_BUCKET_FILES: 10
AWS_CODE_DEPLOY_S3_SSE: true
AWS_CODE_DEPLOY_REVISION_DESCRIPTION: "${CIRCLE_BRANCH} (#${CIRCLE_SHA1:0:7})"
AWS_CODE_DEPLOY_DEPLOYMENT_DESCRIPTION: "Deployed via CircleCI on $(date)"
AWS_CODE_DEPLOY_DEPLOYMENT_FILE_EXISTS_BEHAVIOR: "OVERWRITE"
# ...
deployment:
production:
branch: master
commands:
- bash vendor/bin/aws-code-deploy.sh
IAM要求
为了使脚本成功执行,指定的AWS凭证必须授予对应操作所需的IAM权限。由于此脚本的各个步骤是可选的,因此它允许在创建策略时具有灵活性,应用最小权限原则。下面描述了两个常见示例。通常,脚本需要访问以下内容(根据参数而定)
- Code Deploy - 验证应用程序、创建应用程序、创建版本
- Code Deploy部署 - 创建部署、创建部署组、列出实例
- S3 - 上传包到S3、删除旧版本
通配符访问
这可能最适合初学者,
具有完整功能的有明确访问权限
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"codedeploy:CreateApplication",
"codedeploy:GetApplication",
"codedeploy:GetApplicationRevision",
"codedeploy:RegisterApplicationRevision"
],
"Resource": [
"arn:aws:codedeploy:us-west-2:XXXXXXXXXXXX:application:TechPivot"
]
},
{
"Effect": "Allow",
"Action": [
"codedeploy:CreateDeployment",
"codedeploy:CreateDeploymentGroup",
"codedeploy:GetDeployment",
"codedeploy:GetDeploymentGroup",
"codedeploy:GetDeploymentInstance",
"codedeploy:ListDeploymentInstances"
],
"Resource": [
"arn:aws:codedeploy:us-west-2:XXXXXXXXXXXX:deploymentgroup:TechPivot/*"
]
},
{
"Effect": "Allow",
"Action": [
"codedeploy:GetDeploymentConfig"
],
"Resource": [
"arn:aws:codedeploy:us-west-2:XXXXXXXXXXXX:deploymentconfig:CodeDeployDefault.OneAtATime",
"arn:aws:codedeploy:us-west-2:XXXXXXXXXXXX:deploymentconfig:CodeDeployDefault.HalfAtATime",
"arn:aws:codedeploy:us-west-2:XXXXXXXXXXXX:deploymentconfig:CodeDeployDefault.AllAtOnce"
]
},
{
"Effect": "Allow",
"Action": [
"s3:DeleteObject",
"s3:GetObject",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::techpivot-codedeploy-us-west-2/*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:ListObjects"
],
"Resource": [
"arn:aws:s3:::techpivot-codedeploy-us-west-2"
]
}
]
}
详细工作流程与变量信息
步骤1:检查依赖项
以下可执行文件已安装
- python-pip
- aws
步骤2: 配置AWS
此步骤确保AWS CLI的配置参数设置正确。
环境变量
AWS_CODE_DEPLOY_KEY
(可选):AWS访问密钥ID。如果尚未在aws cli中配置,则此选项是必需的。AWS_CODE_DEPLOY_SECRET
(可选):AWS秘密访问密钥。如果尚未在aws cli中配置,则此选项是必需的。AWS_CODE_DEPLOY_REGION
(可选):默认区域名称
第3步:检查应用
此步骤确保应用存在于Code Deploy中。如果不存在,它将尝试使用指定的名称创建应用。
环境变量
AWS_CODE_DEPLOY_APPLICATION_NAME
(必需):要部署的应用名称
第4步:部署配置(可选)
此步骤确保指定的部署配置已存在于应用中。定义自定义配置是可选的,因为您可以使用Code Deploy中已定义的部署策略。
环境变量
AWS_CODE_DEPLOY_DEPLOYMENT_CONFIG_NAME
(可选):部署配置名称。默认:CodeDeployDefault.OneAtATime。内置选项- CodeDeployDefault.OneAtATime
- CodeDeployDefault.AllAtOnce
- CodeDeployDefault.HalfAtATime
AWS_CODE_DEPLOY_MINIMUM_HEALTHY_HOSTS
(可选):部署期间的最小健康实例数。默认:type=FLEET_PERCENT,value=75
第5步:部署组
此步骤确保指定的部署组存在于指定应用中。如果不存在,脚本将尝试使用名称和定义的服务角色ARN创建组。
环境变量
-
AWS_CODE_DEPLOY_DEPLOYMENT_GROUP_NAME
(必需):部署组名称 -
AWS_CODE_DEPLOY_SERVICE_ROLE_ARN
(可选):创建部署组时给予使用Code Deploy的权限的服务角色arn -
AWS_CODE_DEPLOY_EC2_TAG_FILTERS
(可选):创建部署组时过滤的EC2标签。指定为以下逗号分隔的键的字符串- 键 字符串
- 值 字符串
- 类型 字符串 - 或者:
KEY_ONLY
或VALUE_ONLY
或KEY_AND_VALUE
例如:
AWS_CODE_DEPLOY_EC2_TAG_FILTERS="Key=Type,Value=www,Type=KEY_AND_VALUE"
-
AWS_CODE_DEPLOY_AUTO_SCALING_GROUPS
(可选):创建部署组时的自动扩展组
所需的IAM访问权限
"codedeploy:CreateDeploymentGroup",
"codedeploy:GetDeploymentGroup"
第6步:压缩源
此步骤将指定的源目录压缩为zip文件,以便上传到S3。这对于使用每个修订版独特文件名的应用部署很有用。这有助于限制部署期间与S3的传输。
环境变量
AWS_CODE_DEPLOY_APP_SOURCE
(必需):指定应用的根源内容。appspec.yml
应位于此目录中。如果没有指定,则脚本将使用当前工作目录。AWS_CODE_DEPLOY_S3_FILENAME
(必需):S3中的目标名称。请注意,不应该包含任何前缀键,因为这些在其他地方定义。一种推荐的良好实践是将CI构建编号与git简短修订版结合使用。(例如:"100#c3a5fea.zip")
第7步:推送到S3
此步骤包括将应用推送到S3。
环境变量
-
AWS_CODE_DEPLOY_S3_BUCKET
(必需):部署修订版的S3存储桶名称 -
AWS_CODE_DEPLOY_S3_KEY_PREFIX
(可选):用于文件键的前缀。强烈建议为每个部署组在存储桶中使用前缀。这允许限制每个部署组的存储修订版。注意:不需要开头的或结尾的反斜杠。例如
AWS_CODE_DEPLOY_S3_BUCKET="my-bucket-test" AWS_CODE_DEPLOY_S3_KEY_PREFIX="production-www" AWS_CODE_DEPLOY_S3_FILENAME="100#c3a5fea.zip" # The resulting stored file would exist at s3://my-bucket-test/production-www/100#c3a5fea.zip
第8步:限制每个存储桶/键的部署修订版数量
此步骤确保具有高修订/提交量的应用可以通过删除旧修订版来帮助限制容器的大小。大型团队可能会根据项目快速填满S3,每天数TB。由于部署通常不需要存储那么多的版本,因此此步骤将确保只存在N个修订版,在部署时删除最旧的修订版。
注意:如果指定了限制,下面的IAM权限将需要为特定的s3://bucket/(key)授予。
环境变量
AWS_CODE_DEPLOY_S3_LIMIT_BUCKET_FILES
(可选):限制的修订次数。如果为0,则无限制。默认值:0
所需的IAM访问权限
- 通配符:
s3:DeleteObject
,s3:GetObject
- 存储桶策略:
s3:ListBucket
,s3:ListObjects
步骤9: 注册修订版本
此步骤将上传的文件注册为指定应用程序/部署组的代码部署修订版本。
环境变量
AWS_CODE_DEPLOY_REVISION_DESCRIPTION
(可选):存储在AWS Code Deploy中,包含有关特定修订版本的信息的描述。通常,修订详细信息将存储有关提交/CI/构建细节的特定信息。
步骤10: 创建部署
此步骤使用定义的部署设置在整个匹配部署组的所有主机上部署应用程序修订版本。
环境变量
AWS_CODE_DEPLOY_DEPLOYMENT_DESCRIPTION
(可选):存储在AWS Code Deploy中,包含有关特定修订版本的信息的描述。
监控部署
此步骤监控部署并记录有关整体状态以及任何失败的实例状态的信息。
环境变量
AWS_CODE_DEPLOY_DEPLOYMENT_OVERVIEW
(可选):布尔值,指定是否记录有关部署状态的详细信息。默认值:true