在CodeStar和CodePipeline中为AWS Lambda服务创建环境的问题

时间:2018-04-21 15:14:02

标签: amazon-web-services aws-lambda amazon-cloudformation aws-codepipeline aws-codestar

我使用AWS CodeStar创建一个新的应用程序,使用" Express.js Aws Lambda Webservice" CodeStar模板。这很棒,因为它使用AWS CodePipeline为我提供了一个简单的CI / CD管道。默认情况下,管道有3个步骤,用于从git仓库中获取源代码,运行构建步骤,然后部署到" dev"环境。

我的问题是我无法设置它以便我的管道有多个环境:dev,staging和prod。

我当前的部署步骤有两个操作: GenerateChangeSet ExecuteChangeSet 。以下是原始开发环境构建步骤中的操作配置,这些配置非常有效:

enter image description here

enter image description here

我已经在我的管道末端创建了一个新的部署阶段,以便部署到分段,但说实话,我不确定如何更改配置。我想最终我希望能够进入AWS控制台的AWS Lambda部分并看到三个独立的lambda函数:binance-bot-dev,binance-bot-staging,binance-bot-prod。然后我可以将其中的每一个设置为cloudwatch预定事件或使用自己的api网关url进行公开。

这是我尝试用于新部署阶段的配置:

enter image description here

enter image description here

我真的不确定这个配置是否正确以及我应该以我想要的方式进行部署的具体内容。

例如,我是否应该更改"堆栈名称",或者我应该将其保留为" 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我使用完全相同的配置,除了我更改了" Dev:"到"分期:"在"资源",我也改变了NODE_ENV环境变量的值。所以,我基本上想知道这是我试图实现的正确配置吗?

假设配置中的所有内容都是正确的,那么我需要对此错误进行故障排除。如上所述设置了所有内容,我可以运行我的管道,但是当它进入我的临时构建步骤时, GenerateChage_Staging 操作将失败并显示以下错误消息:

  

操作执行失败用户:   阿尔恩:AWS:STS :: 954459734159:假设角色/ CodeStarWorker-binance - 僵尸CodePipeline / 1524253307698   无权执行:cloudformation:DescribeStacks on   资源:   阿尔恩:AWS:cloudformation:美国东部-1:954459734159:堆栈/ awscodestar-binance博特 - 拉姆达分期/ *   (服务:AmazonCloudFormation;状态代码:403;错误代码:   拒绝访问;要求ID:dd801664-44d2-11e8-a2de-8fa6c42cbf86)

在这个错误消息中我觉得我需要添加" cloudformation:DescribeStacks"对于我的" CodeStarWorker-binance-bot-CodePipeline"所以我去IAM - >角色并单击CodeStarWorker-binance-bot-CodePipeline角色。但是,当我点击" CodeStarWorker-binance-bot-CodePipeline"并深入了解 CloudFormation 的策略信息,看起来这个角色已经拥有" DescribeStacks"的权限!

enter image description here

如果有人能够指出我做错了什么或提供任何有关如何使用AWS CodePipeline进行多个环境的指导,那将会很棒。谢谢!

更新:

我更改了#34;堆栈名称"在我的Deploy_To_Staging管道阶段回到" awscodestar-binance-bot-lambda"。但是,然后我从GenerateChange_Staging操作中得到此错误:

  

操作执行失败无效的TemplatePath:   binance-僵尸BuildArtifact ::模板export.staging.yml。神器   binance-bot-BuildArtifact不存在

更新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: - >命令:"部分:

  - 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

我将其添加到"文件:"

  • 模板export.staging.yml
  • 模板export.prod.yml

然而,我仍然收到错误" binance-bot-BuildArtifact不存在"。

执行buildspec.yml更改后,这是完整错误:

  

操作执行失败无效的TemplatePath:   binance-僵尸BuildArtifact ::模板export.staging.yml。神器   binance-bot-BuildArtifact不存在

对我来说,我可以访问" binance-bot-BuildArtifact"在管道的一个阶段而不是另一个阶段。可能是构建工件仅在构建阶段之后直接用于一个管道阶段吗?有人可以帮助我能够访问这个" binance-bot-BuildArtifact"?谢谢!

2 个答案:

答案 0 :(得分:1)

  

例如,我是否应该更改"堆栈名称",或者我应该将其保留为" awscodestar-binance-bot-lambda"或者像我在这里一样为每个环境改变它?

您应该为每个环境使用唯一的堆栈名称。如果你没有,那么你将取代你的“开发者”。环境与您的分期'环境,等等。

  

所以,我基本上想知道这是我正在尝试实现的正确配置吗?

我不这么认为。您应该为每个环境使用完全相同的模板。要更改每个部署的环境名称,您可以使用'参数覆盖'字段为您的“环境”选择正确的值。参数。

  

看起来这个角色已经拥有" DescribeStacks"的权限!

这里的问题可能是您的IAM角色只对Dev堆栈具有DescribeStacks权限吗?看起来它没有描述登台堆栈的权限。也许你可以在策略中添加一个通配符' /星号,以便它匹配你的所有堆栈名称?

  

可能是构建工件仅在构建阶段之后直接用于一个管道阶段吗?

不,这不是我使用CodePipeline的经验。不幸的是,我不知道为什么它会告诉你你的神器无法找到。

答案 1 :(得分:0)

robrtsql已经就两个阶段使用相同的模板提供了一些很好的建议。

您可能会发现this walkthrough有用。 基本上,它描述了添加一个Cloudformation" template configuration"它允许您为Cloudformation堆栈指定参数。

这将允许您在dev和prod环境中部署相同的模板,但也允许您通过在每个阶段选择不同的模板配置来区分开发部署和prod部署。