Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save unloadedroe/ae07bc143935d37f6d195608ae6350b2 to your computer and use it in GitHub Desktop.
Save unloadedroe/ae07bc143935d37f6d195608ae6350b2 to your computer and use it in GitHub Desktop.

Revisions

  1. @ispyinternet ispyinternet created this gist Feb 1, 2018.
    95 changes: 95 additions & 0 deletions gistfile1.txt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,95 @@
    ---
    AWSTemplateFormatVersion: "2010-09-09"
    Description: "Create a Lambda function that will take a comma seperated list of key=value pairs and return an array of key value pairs that can then be used in cloudformation tags resource parameter"

    Resources:
    LambdaExecutionRole:
    Type: AWS::IAM::Role
    Properties:
    ManagedPolicyArns:
    - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
    AssumeRolePolicyDocument:
    Version: '2012-10-17'
    Statement:
    - Effect: Allow
    Principal:
    Service:
    - lambda.amazonaws.com
    Action:
    - sts:AssumeRole
    LambdaTagParser:
    Type: AWS::Lambda::Function
    Properties:
    Handler: index.main
    Role:
    Fn::GetAtt:
    - LambdaExecutionRole
    - Arn
    Runtime: nodejs6.10
    Code:
    ZipFile: |
    exports.main = (event, context, callback) => {
    let keyPairString = event.ResourceProperties.data;
    let keyPairs = keyPairString.split(',').map( item => ({ Key: item.split('=')[0], Value: item.split('=')[1]}));

    sendResponse(event,context,"SUCCESS", { result: keyPairs });
    };

    function sendResponse(event, context, status, data, err) {
    var reason = err ? err.message : '';
    var responseBody = {
    StackId: event.StackId,
    RequestId: event.RequestId,
    LogicalResourceId: event.LogicalResourceId,
    PhysicalResourceId: 'tagparser-' + JSON.stringify(event.ResourceProperties.data),
    Status: status,
    Data: data
    };
    console.log("RESPONSE:\n", JSON.stringify(responseBody));
    var json = JSON.stringify(responseBody);

    var https = require("https");
    var url = require("url");

    var parsedUrl = url.parse(event.ResponseURL);
    var options = {
    hostname: parsedUrl.hostname,
    port: 443,
    path: parsedUrl.path,
    method: "PUT",
    headers: {
    "content-type": "",
    "content-length": json.length
    }
    };

    var request = https.request(options, function(response) {
    console.log("STATUS: " + response.statusCode);
    console.log("HEADERS: " + JSON.stringify(response.headers));
    context.done(null, data);
    });

    request.on("error", function(error) {
    console.log("sendResponse Error:\n", error);
    context.done(error);
    });

    request.on("end", function() {
    console.log("end");
    });
    request.write(json);
    request.end();
    }

    Outputs:
    TemplateId:
    Description: "Template ID"
    Value: "LambdaTagParser"
    StackName:
    Description: "Stack Name"
    Value: !Sub "${AWS::StackName}"
    FunctionArn:
    Description: "Function ARN"
    Value: !Ref LambdaTagParser
    Export:
    Name: !Sub '${AWS::StackName}-FunctionArn'