我使用AWS CodeStar使用“Express.js Aws Lambda Webservice”CodeStar模板创建一个新应用程序 . 这很棒,因为它使用AWS CodePipeline为我提供了一个简单的CI / CD管道 . 默认情况下,管道有3个步骤,用于从git仓库中获取源代码,运行构建步骤,然后部署到“dev”环境 .
My issue is that I can't set it up so that my pipeline has multiple environments: dev, staging, and prod.
我当前的部署步骤有两个操作:GenerateChangeSet和ExecuteChangeSet . 以下是原始开发环境构建步骤中的操作配置,它们运行良好:
我已经在我的管道末端创建了一个新的部署阶段,以部署到暂存,但说实话,我不确定如何更改配置 . 我想最终我希望能够进入AWS控制台的AWS Lambda部分并看到三个独立的lambda函数:binance-bot-dev,binance-bot-staging,binance-bot-prod . 然后我可以将其中的每一个设置为cloudwatch预定事件或使用自己的api网关url进行公开 .
这是我尝试用于新部署阶段的配置:
我真的不确定这个配置是否正确,我应该改变什么才能以我想要的方式进行部署 .
例如,我应该更改“堆栈名称”,还是应该将其保留为“awscodestar-binance-bot-lambda”或更改为每个环境,因为我在这里?
另外,我指向项目中的另一个template.yml文件 . 原始的template.yml看起来像这样:
AWSTemplateFormatVersion: 2010-09-09
Transform:
- AWS::Serverless-2016-10-31
- AWS::CodeStar
Parameters:
ProjectId:
Type: String
Description: AWS CodeStar projectID used to associate new resources to team members
Resources:
Dev:
Type: AWS::Serverless::Function
Properties:
Handler: index.handler
Runtime: nodejs4.3
Environment:
Variables:
NODE_ENV: dev
Role:
Fn::ImportValue:
!Join ['-', [!Ref 'ProjectId', !Ref 'AWS::Region', 'LambdaTrustRole']]
Events:
GetEvent:
Type: Api
Properties:
Path: /
Method: get
PostEvent:
Type: Api
Properties:
Path: /
Method: post
对于template.staging.yml我使用完全相同的配置,除了我在"Resources"下将"Dev:"更改为"Staging:",并且我还更改了NODE_ENV环境变量的值 . 所以,我基本上想知道 is this the correct configuration for what I'm trying to achieve?
假设配置中的所有内容都是正确的,那么我需要对此错误进行故障排除 . 如上所述设置了所有内容,我可以运行我的管道,但是当它进入我的临时构建步骤时,GenerateChage_Staging操作将失败,并显示以下错误消息:
动作执行失败用户:arn:aws:sts :: 954459734159:assume-role / CodeStarWorker-binance-bot-CodePipeline / 1524253307698无权执行:cloudformation:DescribeStacks on resource:arn:aws:cloudformation:us-east- 1:954459734159:stack / awscodestar-binance-bot-lambda-staging / *(服务:AmazonCloudFormation;状态代码:403;错误代码:AccessDenied;请求ID:dd801664-44d2-11e8-a2de-8fa6c42cbf86)
在我看来,从这个错误消息中我需要为我的"CodeStarWorker-binance-bot-CodePipeline"添加"cloudformation:DescribeStacks"所以我转到IAM - > Roles并单击CodeStarWorker-binance-bot-CodePipeline角色 . 但是,当我单击"CodeStarWorker-binance-bot-CodePipeline"并深入查看CloudFormation的策略信息时,看起来此角色已具有"DescribeStacks"的权限!
如果有人能够指出我做错了什么或提供任何指导,理解和思考如何使用AWS CodePipeline进行多个环境,这将是非常好的 . 谢谢!
UPDATE:
我将Deploy_To_Staging管道阶段中的“堆栈名称”更改回“awscodestar-binance-bot-lambda” . 但是,然后我从GenerateChange_Staging操作中得到此错误:
动作执行失败无效的TemplatePath:binance-bot-BuildArtifact :: template-export.staging.yml . Artifact binance-bot-BuildArtifact不存在
UPDATE 2: 在我的项目的根目录中,我有一个由CodeStar生成的buildspec.yml文件 . 它看起来像这样:
version: 0.2
phases:
install:
commands:
# Install dependencies needed for running tests
- npm install
# Upgrade AWS CLI to the latest version
- pip install --upgrade awscli
pre_build:
commands:
# Discover and run unit tests in the 'tests' directory
- npm test
build:
commands:
# Use AWS SAM to package the application using AWS CloudFormation
- aws cloudformation package --template template.yml --s3-bucket $S3_BUCKET --output-template template-export.yml
- aws cloudformation package --template template.staging.yml --s3-bucket $S3_BUCKET --output-template template-export.staging.yml
- aws cloudformation package --template template.prod.yml --s3-bucket $S3_BUCKET --output-template template-export.prod.yml
artifacts:
type: zip
files:
- template-export.yml
然后我将其添加到CloudFormation部分:
然后我将其添加到“build: - > commands:”部分:
- aws cloudformation package --template template.staging.yml --s3-bucket $S3_BUCKET --output-template template-export.staging.yml
- aws cloudformation package --template template.prod.yml --s3-bucket $S3_BUCKET --output-template template-export.prod.yml
我把它添加到“文件:”
-
template-export.staging.yml
-
template-export.prod.yml
但是,我 still 收到"binance-bot-BuildArtifact does not exist"的错误 .
执行buildspec.yml更改后,这是完整错误:
动作执行失败无效的TemplatePath:binance-bot-BuildArtifact :: template-export.staging.yml . Artifact binance-bot-BuildArtifact不存在
我觉得很奇怪,我可以在管道的一个阶段访问“binance-bot-BuildArtifact”而不是另一个阶段 . 可能是构建工件仅在构建阶段之后直接用于一个管道阶段吗?有人可以帮助我能够访问这个“binance-bot-BuildArtifact”吗?谢谢!
2 回答
您应该为每个环境使用唯一的堆栈名称 . 如果你没有,那么你将用'staging'环境替换你的'dev'环境,等等 .
我不这么认为 . 您应该为每个环境使用完全相同的模板 . 要更改每个部署的环境名称,可以使用“参数覆盖”字段为“环境”参数选择正确的值 .
这里的问题可能是你的IAM角色只对Dev堆栈有DescribeStacks权限吗?看起来它没有描述登台堆栈的权限 . 也许你可以在策略中添加一个'通配符'/星号,以便它匹配你的所有堆栈名称?
不,这不是我使用CodePipeline的经验 . 不幸的是,我不知道为什么它告诉你无法找到你的工件 .
robrtsql已经在两个阶段使用相同模板方面提供了一些很好的建议 .
您可能会发现this walkthrough很有用 . 基本上,它描述了添加一个Cloudformation“template configuration”,它允许您为Cloudformation堆栈指定参数 .
这将允许您在dev和prod环境中部署相同的模板,但也允许您通过在每个阶段中选择不同的模板配置来区分开发部署和prod部署 .