[PYTHON] [AWS] Behebung eines Problems, bei dem Lambda von CodePipeline aus angerufen hat

Problem

** Der Indikator dreht sich ständig **

スクリーンショット 2019-11-08 23.47.25.png (10 Minuten stehen, es bleibt gleich) Ich bin verrückt! !! !!

Ich bin gestolpert, als ich Lambda anrufen wollte, um den CloudFront-Cache nach Abschluss der Bereitstellung in S3 zu leeren, und habe ihn zusammengefasst.

Ursache

** Weil codepipeline: PutJobSuccessResult (*) nicht zurückgegeben wird **

  • Im Fehlerfall codepipeline: PutJobFailedResult

Was ist PutJobSuccessResult?

PutJobSuccessResult Erforderlich, um den Erfolg des vom Jobarbeiter zurückgegebenen Jobs an die Pipeline zu melden. Wird nur für benutzerdefinierte Aktionen verwendet. Zitiert aus https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/permissions-reference.html

images.png

Zusammenfassend

CodePipeline empfängt nur die Ergebnisse von ** benutzerdefinierten Aktionen (wie Lambda), die es in einem festen Format aufruft **, PutJobSuccessResult und PutJobFailedResult. ** Auch wenn es in einem anderen Format zurückgegeben wird, wird es ignoriert, sodass sich der Indikator dreht **, dass das Ergebnis schon lange nicht mehr von Lambda stammt.

Wenn PutJobSuccessResult zurückgegeben wird

スクリーンショット 2019-11-08 23.56.48.png

Wenn PutJobFailedResult zurückgegeben wird

スクリーンショット 2019-11-09 0.09.46.png スクリーンショット 2019-11-09 0.09.58.png

Ich habe es geschafft. </ font>

Korrespondenz

** OK, indem Sie Code schreiben, der "PutJobSuccessResult" und "PutJobFailedResult" auf Lambda zurückgibt. ** ** **

Wie man tatsächlich PutJobSuccessResult und PutJobFailedResult in Lambda nach Sprache zurückgibt.

Python

Lambda-Laufzeit_Python3.7


import json
import boto3

def lambda_handler(event, context):
    codepipeline = boto3.client('codepipeline')
    
    #Ergebnisse auf CodePipeline(Erfolg)Gib es zurück
    codepipeline.put_job_success_result(jobId = event['CodePipeline.job']['id'])
    
    #Ergebnisse auf CodePipeline(Fehler)Gib es zurück
    # codepipeline.put_job_failure_result(
    #     jobId = event['CodePipeline.job']['id'],
    #     failureDetails={
    #         'type': 'JobFailed',
    #         'message': 'Failed test.'
    #     }
    # )
    
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

Ruby

Lambda-Laufzeit_Ruby2.5


require 'json'
require 'aws-sdk'

def lambda_handler(event:, context:)
    codepipeline = Aws::CodePipeline::Client.new()
    
    #Ergebnisse auf CodePipeline(Erfolg)Gib es zurück
    codepipeline.put_job_success_result({job_id: event["CodePipeline.job"]['id']})
    
    #Ergebnisse auf CodePipeline(Fehler)Gib es zurück
    # codepipeline.put_job_failure_result({
    #    job_id: event["CodePipeline.job"]['id'], 
    #    failure_details: {
    #        type: "JobFailed", # accepts {JobFailed, ConfigurationError, PermissionError, RevisionOutOfSync, RevisionUnavailable, SystemUnavailable}
    #        message: "Failed test."
    #    }
    # })
    
    { statusCode: 200, body: JSON.generate('Hello from Lambda!') }
end

Node.js

javascript:Lambda-Laufzeit_Node.js10.x


var AWS = require('aws-sdk');

exports.handler = function(event, context) {
    var codepipeline = new AWS.CodePipeline();
    
    //Ergebnisse auf CodePipeline(Erfolg)Gib es zurück
    codepipeline.putJobSuccessResult({jobId: event["CodePipeline.job"].id}, function(err, data) {
        if(err) {
            context.fail(err);
        } else {
            context.succeed('Success test.');
        }
    });
    
    //Ergebnisse auf CodePipeline(Fehler)Gib es zurück
    // var params = {
    //     jobId: event["CodePipeline.job"].id,
    //     failureDetails: {
    //         message: JSON.stringify('Failed test.'),
    //         type: 'JobFailed',
    //     }
    // };
    // codepipeline.putJobFailureResult(params, function(err, data) {
    //     context.fail('Failed test.');
    // });
    
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};

Normalerweise schreibe ich Node.js nicht, daher weiß ich nicht, ob dies der erforderliche Mindestcode ist. </ Font>

Obwohl ich den Code kopiert habe, dreht er sich immer noch!

Schauen wir uns zunächst das CloudWatch-Protokoll von Lambda an.

AccessDeniedException

Als Ergebnis der Ausführung von Lambda zeigt CloudWatch Log so etwas an.

{
   "errorType": "AccessDeniedException",
   "errorMessage": "User: arn:aws:sts::1111111111111:assumed-role/codetest-role-xxxxxxxxx/codetest is not authorized to perform: codepipeline:PutJobSuccessResult",
    ...etc
}

Sie haben auch die Berechtigung, Ergebnisse von Lambda an CodePipeline zurückzugeben ...

Die folgende IAM-Richtlinie muss der Lambda zugewiesenen IAM-Rolle hinzugefügt werden.

IAM-Richtlinie


{
  "Version": "2012-10-17", 
  "Statement": [
    {
      "Action": [ 
        "logs:*"
      ],
      "Effect": "Allow", 
      "Resource": "arn:aws:logs:*:*:*"
    },
    {
      "Action": [
        "codepipeline:PutJobSuccessResult",
        "codepipeline:PutJobFailureResult"
        ],
        "Effect": "Allow",
        "Resource": "*"
     }
  ]
} 

Bitte lassen Sie mich wissen, wenn Sie Fehler machen.