18.5创建您的Microsoft Azure项目

18.5.1熟悉Azure事件中心功能

Azure函数允许您运行少量代码(称为函 ),无需担心应用程序基础结构。 借助Azure功能,云基础架构可提供您需要的所有最新服务器,使应用程序保持大规模运行。

函数由 特定 类型的事件触发。 支持的触发器包括响应数据中的更改、响应消息(例如事件中心)、在计划上运行或作为HTTP请求的结果。

Azure函数是一种无服务器的计算服务,它允许您运行事件触发的代码,而无需显式设置或管理基础结构。

Azure事件集线器与Azure功能相集成,用于无服务器架构。

18.5.2打开Visual Studio代码并登录Azure

Visual Studio代码使您能轻松……

  • 定义Azure函数并将其绑定到事件集线器
  • 本地测试
  • 部署到Azure
  • 远程日志功能执行

打开Visual Studio代码

要打开Visual Studio代码,请 在您 的操作系统搜索中输入visual(OSX上的聚焦搜索,在窗口的任务栏中搜索)。 如果找不到,您需要重复练习0 —— 先决条件 中所述的步骤

visual-studio-code-icon.png

登录Azure

当您使用您用来注册练习0 —— 先决条件 的Azure帐户登录时,Visual Studio代码将允许您查找并绑定所有事件中心资源。

单击Visual Studio Code中的Azure图标。 如果您没有此选项,则安装所需的扩展时可能出现问题。

接下来选 择登录到Azure:

3-01-vsc-open.png

您将被重定向到浏览器以登录。 请记住选择您用于注册的Azure帐户。

3-02-vsc-pick-account.png

当您在浏览器中看到以下屏幕时,您将使用Visual Code Studio登录:

3-03-vsc-login-ok.png

返回Visual Code Studio(您将看到Azure订阅的名称,例如Azure 订阅1):

3-04-vsc-logged-in.png

18.5.3创建Azure项目

当您将鼠标悬 停在Azure订阅 1上时,该部分上方将显示一个菜单 ,选择“创建​新项目……”:

3-05-vsc-create-project.png

选择您选择的本地文件夹以保存项目,然后单击“选 :

3-06-vsc-select-folder.png

您现在将进入项目创建向导。 选择 Javascript 作为项目的语言:

3-07-vsc-select-language.png

择Azure事件中心触发器 ,作为项目的第一个函数模板:

3-08-vsc-function-template.png

为函数输入名称,使用以 下格式ldap-aep-事件-hub -trigger并按Enter:

3-09-vsc-function-name.png

选择 创建新的本地应用程序设置:

3-10-vsc-function-local-app-setting.png

选择一个事件中心命名空间,您应当看到在练习2中定义的事件 中心。 在此示例中,事件中心 命名空间为mmeewis-aep-enablement:

3-11-vsc-function-select-命名空间.png

选择事件中心,您应看到在练习2中定义的事件 中心。 在我的例子 中,这是mmeewis-aep-enablement-事件-hub:

3-12-vsc-function-select-eventhub.png

选择 RootManageSharedAccessKey 作为事件中心策略:

3-13-vsc-function-select-eventhub-policy.png

输入以使用 默认:

3-14-vsc-eventhub-consumer-group.png

选择 添加到工作区 ,了解如何打开项目:

3-15-vsc-project-add-to-workspace.png

创建项目后,单击 index.js ,在编辑器中打开文件:

3-16-vsc-open-index-js.png

由Adobe Experience Platform发送到您的事件中心的有效负荷将包括段ID:

[{
"segmentMembership": {
"ups": {
"ca114007-4122-4ef6-a730-4d98e56dce45": {
"lastQualificationTime": "2020-08-31T10:59:43Z",
"status": "realized"
},
"be2df7e3-a6e3-4eb4-ab12-943a4be90837": {
"lastQualificationTime": "2020-08-31T10:59:56Z",
"status": "realized"
},
"39f0feef-a8f2-48c6-8ebe-3293bc49aaef": {
"lastQualificationTime": "2020-08-31T10:59:56Z",
"status": "realized"
}
}
},
"identityMap": {
"ecid": [{
"id": "08130494355355215032117568021714632048"
}]
}
}]

我们的事件中心功能将在AEP响应有效负荷中为每个区段添加区段名称。 为此,我们azure函数将调用AdobeIO运行时函数从Adobe Experience Platform获取段定义。 此运行时函数将返回段定义,段名称与所有和您的ldap 开始 ,以便 。 前缀为“全 ”的区段是您的Adobe Experience Platform环境使用的 默认区段,例如全​部——主页访客。

在Visual Studio代码中您将收到的响应将包含许多与所有内容开始的 区段,它还应包 括ldap - Luma Sports Fan 区段。 否则,您命名区段的命名可能不正确:

{
  "segments": {
    "39f0feef-a8f2-48c6-8ebe-3293bc49aaef": {
      "description": "mmeewis - Citi Signal Sports Fan",
      "name": "mmeewis - Citi Signal Sports Fan"
    },
    "a77d96aa-d166-43b1-baba-005d35261b8a": {
      "description": "all - Interest in Nadia Elements Shell",
      "name": "all - Interest in Nadia Elements Shell"
    },
    "ca114007-4122-4ef6-a730-4d98e56dce45": {
      "description": "all - Homepage Visitors",
      "name": "all - Homepage Visitors"
    }
  }
}

将Visual Studio代码的index.js中的代码替换为下面的代码。 每次Adobe Experience Platform实时CDP向您的事件中心目标发送细分资格时,都将执行此代码。 在我们的示例中,该代码只是关于显示和增强接收的有效负荷。 但是,您可以想象任何一种功能来实时处理细分资格。

// Marc Meewis - Solution Consultant Adobe - 2020
// Adobe Experience Platform Enablement - Module 18

const request = require('request');

const sandbox = "--module18sandbox--";
const ldap = "--demoProfileLdap--";
const segmentDefAPIEndpoint = "--jwtSegment--";

// Main function
// -------------
// This azure function is fired for each segment activated to the Adobe Exeperience Platform Real-time CDP Azure 
// Eventhub destination
// This function enriched the received segment payload with the name fo the segment. 
// You can replace this function with any logic that is require to process and deliver
// Adobe Experience Platform segments in real-time to any application or platform that 
// would need to act upon an AEP segment qualiification.
// 

module.exports = async function (context, eventHubMessages) {

    return new Promise (function (resolve, reject) {

        // fetch aep segment definitions first

        getAEPSegmentInfo().then(function(segments) {
        
            eventHubMessages.forEach((message, index) => {

                // process each eventhub message

                var segmentKeys = Object.keys(message.segmentMembership.ups);

                for (var segmentKey of segmentKeys) {

                    // lookup the segment-id in the segment definitions and add the 
                    // the segment name to the eventhub payload

                    var segmentContent = "";

                    if (segments.hasOwnProperty(segmentKey)) {
                        segmentName = segments[segmentKey].name;
                    }
                    else {
                        segmentName = "Not Found";
                    }

                    // add the segment name to the payload

                    message.segmentMembership.ups[segmentKey].segmentName = segmentName;
                    
                }

            });

            // output the enriched Adobe Experience Platform payload send to Azure Eventhub

            context.log('Message : ' + JSON.stringify(eventHubMessages, null, 2));

            resolve();

        });

    });    

};


// helper functions

function extractSegmentDenitions(segments, segmentdata) {

    for (var s=0; s < segmentdata.length; s++) {
        var segmentDef = segmentdata[s];

        var segment = {};

        segment.name = segmentDef.name;
        segment.description = "";
        if (segmentDef.hasOwnProperty("description")) {
            segment.description = segmentDef.description;
        }

        segments[segmentDef.id] = segment;

    }

    return segments;

}



async function getAEPSegmentDefinitions(segmentFilter, segments) {

    return new Promise (function (resolve, reject) {

        const allSegmentsAPICall = segmentDefAPIEndpoint + "?segmentFilter=" + segmentFilter + "&sandboxId=" + sandbox;

        var options = {
            method:'get',
            url:allSegmentsAPICall
        };
        
        request(options, function (error, response, body) {
            if (error) 
                reject(error);
            else {
                
                segmentsResponse = JSON.parse(body)

                segments = extractSegmentDenitions(segments, segmentsResponse.segmentData.segments);

                resolve(segments);
            }

        });

    });

}

async function getAEPSegmentInfo() {

    var segments = {};

    return new Promise (async function (resolve, reject) {

        segments = await getAEPSegmentDefinitions("all", segments);

        segments = await getAEPSegmentDefinitions(ldap, segments);
                
        resolve(segments);

    });

}

在index.js中粘贴下面的代码后,请确保修 改第4行 ,以反映您的ldap,在此示例中,即 mmeewis:

const ldap = "mmeewis";

结果应该如下:

3-16b-vsc-edit-index-js.png

18.5.4运行Azure项目

现在是运行项目的时候了。 目前,我们不会将项目部署到Azure。 我们将在调试模式下本地运行它。 选择“运行”图标,单击绿色箭头。 首次在调试模式下运行项目时,您需要附加一个Azure存储帐户,单击“选 择存储帐户”

3-17-vsc-run-project.png

从存储帐户的列表中,选择您作为18.1.4设置您的Azure 存储帐户的一部分创建的帐户。 您的存储帐户 名为 ldapapstorage,例如: mmeewisaepstorage

3-22-vsc-select-存储-account.png

您的项目现已启动并正在运行,并且列出给事件中心的事件。 在下一个练习中,您将在Citi Signal网站上展示符合这些细分资格的行为。 因此,您将在事件中心触发功能的终端中收到段资格有效负荷:

3-23-vsc-application-started.png

18.5.5停止Azure项目

要停止项目,请选择“终 ”选项卡,在终端窗口中单击,然 后在OSX上按CMD -C ,或在Windows 上按CTRL-C:

3-24-vsc-application-stop.png

下一步: 18.6端到端方案

返回模块18

返回到所有模块

在此页面上