2017-08-29 27 views
1

javaで開発されたAWSラムダのデプロイメントを自動化したいと思います。このため私はで起動されたCodePipelineを作成しました。コマンドをCodeCommitリポジトリに送ります。 CodePipelineの次のステップは、CodeBuildプロジェクトです。AWS CodeBuildがCodePipelineから呼び出され、AWSラムダには使用できないアーティファクトを生成します

version: 0.1 

phases: 
    build: 
    commands: 
     - echo Entering build phase... 
     - echo Build started on `date` 
     - mvn package shade:shade 
     - mv target/Output-1.0.jar . 
artifacts: 
    files: 
    - Output-1.0.jar 

CodeBuildプロジェクトを手動で実行されると、それはS3バケットにjarファイルをアップロードします:CodeBuildには、以下のbuildspec.ymlファイルを使用しています。このjarファイルはラムダの更新に問題なく使用でき、すべてが期待どおりに動作します。しかし、CodeBuildがCodePipeline経由で実行された場合、結果はjarファイルがzip内にラップされます。このzipはラムダ関数の更新には使用できないため、CodeBuildプロジェクトのパッケージセットを上書きするため、ここで何をすべきかはわかりません。

CodePipelineがCodeBuildをトリガーして、追加のラムダが実行する出力を生成し、ラムダ関数をそれによって更新することが考えられます。 CodePipelineから呼び出されたCodeBuildの出力がzipの代わりにjarになることは何とか可能ですか?そうでなければ、私はここで何をすべきですか?

何か助けていただければ幸いです。

答えて

1

zipまたはjarファイルの両方を使用してラムダ関数を更新することができます.CodePipelineにCloudFormを使用して「Deploy Step」を追加するだけで済みます。

これは、あなたのJavaプロジェクトに適応しようとすると、nodejsビルド/パイプラインである:

プロジェクトファイル

buildspec.yml

version: 0.2 

phases: 
    install: 
    commands: 
     - echo install phase 
    pre_build: 
    commands: 
     - echo pre_build phase 
    build: 
    commands: 
     - npm install --production  
    post_build: 
    commands: 
     - echo post build 
artifacts: 
    type: zip 
    files: 
    - index.js  
    - node_modules/**/* 
    - package.json 
    - template.yml 
    - configuration.json  
    discard-paths: no 

configuration.json

{ 
    "Parameters": { 
    "BucketName" : { "Fn::GetArtifactAtt" : ["Build", "BucketName"]}, 
    "ObjectKey" : { "Fn::GetArtifactAtt" : ["Build", "ObjectKey"]} 
    } 
} 

template.yml(AWを追加する必要がありますS ::ラムダ::パーミッション)

AWSTemplateFormatVersion: "2010-09-09" 
Description: "My Lambda Template" 
Parameters: 
    BucketName: 
    Type: String 
    ObjectKey: 
    Type: String 
    Roles: 
    Type: String 
    Default: Roles 
    LambdaRole: 
    Type: String 
    Default: LambdaRole 

Resources: 

    MyLambdaFunction: 
    Type: AWS::Lambda::Function 
    Properties: 
     Description: 'My Lambda Handler' 
     Handler: index.handler 
     Runtime: nodejs6.10 
     Timeout: 5 
     Code: 
     S3Bucket: 
      Ref: BucketName 
     S3Key: 
      Ref: ObjectKey 
     Role: 
     Fn::Join: 
      - "" 
      - - "arn:aws:iam::" 
      - !Ref AWS::AccountId 
      - ":role/"   
      - Fn::ImportValue: 
       Fn::Join: 
        - "" 
        - - Ref: Roles 
        - "-" 
        - Ref: LambdaRole 

役割テンプレート

AWSTemplateFormatVersion: '2010-09-09' 
Description: 'The AWS Resource Roles' 
Resources: 
    CodeBuildRole:  
    Type: AWS::IAM::Role  
    Properties: 
     AssumeRolePolicyDocument: 
     Version: "2012-10-17" 
     Statement: 
      Effect: Allow 
      Principal: 
      Service: codebuild.amazonaws.com 
      Action: sts:AssumeRole 
     ManagedPolicyArns: 
     - arn:aws:iam::aws:policy/AWSCodeBuildAdminAccess 
     - arn:aws:iam::aws:policy/CloudWatchFullAccess 
     - arn:aws:iam::aws:policy/AWSCodeCommitFullAccess 
     - arn:aws:iam::aws:policy/AmazonS3FullAccess 

    CodePipelineRole: 
    Type: AWS::IAM::Role 
    Properties: 
     AssumeRolePolicyDocument: 
     Version: "2012-10-17" 
     Statement: 
      Effect: Allow 
      Principal: 
      Service: codepipeline.amazonaws.com 
      Action: sts:AssumeRole  
     Policies: 
     - 
      PolicyName: CloudFormationFullAccess 
      PolicyDocument: 
      Version: "2012-10-17" 
      Statement: 
       - 
       Effect: "Allow" 
       Action: 
        - "cloudformation:*"     
       Resource: "*" 
     ManagedPolicyArns: 
     - arn:aws:iam::aws:policy/AWSCodePipelineFullAccess 
     - arn:aws:iam::aws:policy/AWSCodeCommitFullAccess 
     - arn:aws:iam::aws:policy/AmazonS3FullAccess 
     - arn:aws:iam::aws:policy/AWSCodeBuildAdminAccess   
     - arn:aws:iam::aws:policy/AWSLambdaFullAccess 

    CloudFormationRole: 
    Type: AWS::IAM::Role 
    Properties: 
     AssumeRolePolicyDocument: 
     Version: "2012-10-17" 
     Statement: 
      Effect: Allow 
      Principal: 
      Service: cloudformation.amazonaws.com 
      Action: sts:AssumeRole  
     Policies: 
     - 
      PolicyName: CloudFormationFullAccess 
      PolicyDocument: 
      Version: "2012-10-17" 
      Statement: 
       - 
       Effect: "Allow" 
       Action: "cloudformation:*" 
       Resource: "*" 
     ManagedPolicyArns: 
     - arn:aws:iam::aws:policy/AWSCodePipelineFullAccess 
     - arn:aws:iam::aws:policy/AWSCodeCommitFullAccess 
     - arn:aws:iam::aws:policy/AmazonS3FullAccess 
     - arn:aws:iam::aws:policy/AWSCodeBuildAdminAccess 
     - arn:aws:iam::aws:policy/AWSLambdaFullAccess 
     - arn:aws:iam::aws:policy/AmazonAPIGatewayAdministrator   

    LambdaRole: 
    Type: AWS::IAM::Role 
    Properties: 
     AssumeRolePolicyDocument: 
     Version: "2012-10-17" 
     Statement: 
      Effect: Allow 
      Principal: 
      Service: lambda.amazonaws.com 
      Action: sts:AssumeRole   
     Policies: 
     - 
      PolicyName: CloudFormationFullAccess 
      PolicyDocument: 
      Version: "2012-10-17" 
      Statement: 
       - 
       Effect: "Allow" 
       Action: "cloudformation:*" 
       Resource: "*"  
     ManagedPolicyArns:   
     - arn:aws:iam::aws:policy/AWSLambdaFullAccess 
     - arn:aws:iam::aws:policy/AWSCodePipelineFullAccess 
     - arn:aws:iam::aws:policy/AmazonSESFullAccess 

Outputs: 
    CodeBuildRoleOutput: 
    Description: 'Maybe API CodeBuildRole ARN' 
    Value: !Ref 'CodeBuildRole' 
    Export: 
     Name: !Sub '${AWS::StackName}-CodeBuildRole' 
    CodePipelineRoleOutput: 
    Description: 'Maybe API CodePipelineRole ARN' 
    Value: !Ref 'CodePipelineRole' 
    Export: 
     Name: !Sub '${AWS::StackName}-CodePipelineRole'  
    CloudFormationRoleOutput: 
    Description: 'Maybe API CloudFormationRole ARN' 
    Value: !Ref 'CloudFormationRole' 
    Export: 
     Name: !Sub '${AWS::StackName}-CloudFormationRole' 
    LambdaRoleOutput: 
    Description: 'Maybe API LambdaRole ARN' 
    Value: !Ref 'LambdaRole' 
    Export: 
     Name: !Sub '${AWS::StackName}-LambdaRole' 

CodePipelineバケツ

AWSTemplateFormatVersion: '2010-09-09' 
Description: 'The AWS S3 CodePipeline Bucket' 
Resources: 

    CodePipelineBucket:  
    Type: AWS::S3::Bucket 
    DeletionPolicy: Retain 
    Properties: 
     BucketName: my-code-pipeline-bucket 
     VersioningConfiguration: 
     Status: Enabled 
     AccessControl: BucketOwnerFullControl   

Outputs: 
    CodePipelineBucketOutput: 
    Description: 'CodePipeline Bucket Ref' 
    Value: !Ref CodePipelineBucket 
    Export: 
     Name: !Sub '${AWS::StackName}-CodePipelineBucketRef'  

CodeBuildテンプレート

AWSTemplateFormatVersion: '2010-09-09' 
Description: 'Nodejs CodeBuild Template' 
Parameters: 
    Artifact: 
    Type: String 
    Default: artifact 
    Roles: 
    Type: String 
    Default: Roles 
    CodeBuildRole: 
    Type: String 
    Default: CodeBuildRole 

Resources: 

    NodejsCodeBuild: 
    Type: AWS::CodeBuild::Project 
    DeletionPolicy: Retain 
    Properties: 
     ServiceRole: 
     Fn::ImportValue: 
      Fn::Join: 
      - "" 
      - - Ref: Roles 
       - "-" 
       - Ref: CodeBuildRole  
     Artifacts: 
     Type: no_artifacts  
     Environment: 
     ComputeType: BUILD_GENERAL1_SMALL 
     Image: aws/codebuild/eb-nodejs-6.10.0-amazonlinux-64:4.0.0 
     Type: LINUX_CONTAINER 
     Source: 
     Type: S3 
     Location: !Ref Artifact 
Outputs: 
    NodejsCodeBuildOutput: 
    Description: 'Nodejs CodeBuild Ref' 
    Value: !Ref 'NodejsCodeBuild' 
    Export: 
     Name: !Sub '${AWS::StackName}-NodejsCodeBuildRef' 

CodePipelineテンプレート

AWSTemplateFormatVersion: '2010-09-09' 
Description: 'CodePipeline for Nodejs Applications' 

Parameters: 

    Roles: 
    Type: String 
    Default: Roles 
    CodePipelineRole: 
    Type: String 
    Default: CodePipelineRole 
    CloudFormationRole: 
    Type: String 
    Default: CloudFormationRole 
    CodePipelineBucket: 
    Type: String 
    Default: CodePipelineBucket 
    CodePipelineBucketRef: 
    Type: String 
    Default: CodePipelineBucketRef 
    PipelineName: 
    Type: String 
    Default: PipelineName 
    CodeBuildProject: 
    Type: String 
    Default: NodejsCodeBuild 
    CodeBuildProjectRef: 
    Type: String 
    Default: NodejsCodeBuildRef 
    Branch: 
    Type: String 
    Default: master 
    Repository: 
    Type: String 
    Default: my-repository-name 
    LambdaStack: 
    Type: String 
    Default: LambdaStack 


Resources: 

    NodejsCodePipeline:  
    Type: AWS::CodePipeline::Pipeline 
    Properties: 
     Name: !Ref PipelineName 
     RoleArn: 
     Fn::Join: 
      - "" 
      - - "arn:aws:iam::" 
      - !Ref AWS::AccountId 
      - ":role/"   
      - Fn::ImportValue: 
       Fn::Join: 
        - "" 
        - - Ref: Roles 
        - "-" 
        - Ref: CodePipelineRole 


     ArtifactStore: 
     Location:   
      Fn::Join: 
      - "" 
      - - Fn::ImportValue: 
        Fn::Join: 
        - "" 
        - - Ref: CodePipelineBucket 
         - "-" 
         - Ref: CodePipelineBucketRef 
     Type: S3 

     Stages: 

     - Name: Source 
      Actions: 
      - InputArtifacts: [] 
       Name: Source 
       ActionTypeId: 
       Category: Source 
       Owner: AWS 
       Version: 1 
       Provider: CodeCommit 
       OutputArtifacts: 
       - Name: Master 
       Configuration: 
       BranchName: !Ref Branch 
       RepositoryName: !Ref Repository 
       RunOrder: 1 

     - Name: Build 
      Actions:    
      - Name: Build     
       ActionTypeId: 
       Category: Build 
       Owner: AWS 
       Version: 1 
       Provider: CodeBuild 
       InputArtifacts: 
       - Name: Master 
       OutputArtifacts: 
       - Name: Build    
       Configuration: 
       ProjectName: 
        Fn::Join: 
        - "" 
        - - Fn::ImportValue: 
          Fn::Join: 
          - "" 
          - - Ref: CodeBuildProject 
           - "-" 
           - Ref: CodeBuildProjectRef 
       RunOrder: 1 

     - Name: Stage 
      Actions:    
      - Name: Sandbox     
       ActionTypeId: 
       Category: Deploy 
       Owner: AWS 
       Version: 1 
       Provider: CloudFormation 
       InputArtifacts: 
       - Name: Build 
       OutputArtifacts: 
       - Name: Deploy    
       Configuration: 
       StackName: !Ref LambdaStack 
       ActionMode: CREATE_UPDATE 
       Capabilities: CAPABILITY_IAM 
       TemplateConfiguration: Build::configuration.json 
       TemplatePath: Build::template.yml 
       ParameterOverrides: | 
        { 
        "BucketName" : { "Fn::GetArtifactAtt" : ["Build", "BucketName"]}, 
        "ObjectKey" : { "Fn::GetArtifactAtt" : ["Build", "ObjectKey"]} 
        }     
       RoleArn: 
        Fn::Join: 
        - "" 
        - - "arn:aws:iam::" 
         - !Ref AWS::AccountId 
         - ":role/"   
         - Fn::ImportValue: 
          Fn::Join: 
          - "" 
          - - Ref: Roles 
           - "-" 
           - Ref: CloudFormationRole 
       RunOrder: 1 
+0

こんにちはトム。私たちの答えはTnxです。私はCloudFormationを避けたいと思います。それがなくてもできますか? – newbie

+0

私はそれが曇りなしで行うことができると思います。あなたのビルドスペックでAWS CLIを使用して、生成された成果物(mvnパッケージ)でラムダコードを更新することができます。http://docs.aws.amazon.com/cli/latest/reference/lambda/update- function-code.html パイプラインに別のステップを追加して、ラムダ関数を呼び出すこともできます。その後、aws sdkを使用して、生成されたjarのデプロイメントを実行できます。 –

関連する問題