使

使用 AWS Lambda 函数 URL 向 Slack 发送消息

2025-06-09

使用 AWS Lambda 函数 URL 向 Slack 发送消息

介绍

本教程将向您展示如何使用传入 Webhook API 和 AWS Lambda 函数 URL 向 Slack 应用程序发送消息。

什么是 AWS Lambda 函数 URL?

函数 URL 是 Lambda 函数的专用 HTTP(S) 终端节点。您可以通过 Lambda 控制台或 Lambda API 创建和配置函数 URL。创建函数 URL 时,Lambda 会自动为您生成一个唯一的 URL 终端节点。—— AWS 文档。

在此处了解有关 AWS 函数 URL 的更多信息

什么是 Slack Incoming Webhook?

传入 Webhook 是一种将消息从应用程序发送到 Slack 的简便方法。创建传入 Webhook 会为您提供一个唯一的 URL,您可以将包含消息文本和一些选项的 JSON 有效负载发送到该 URL。您可以使用所有常用的格式和布局块来将传入 Webhook 与 Slack 消息区分开来。—— Slack API 文档

点击此处了解有关 Slack Incoming Webhooks 的更多信息

先决条件

为了继续,您需要以下内容:

  • AWS 账户(在此创建)
  • 已安装并配置 AWS CLI。设置说明请点击此处
  • 一个 Slack 帐户(在此创建)
  • AWS Lambda 函数(基础知识)
  • AWS IAM 角色、策略(基础)。
  • 无需 GUI 即可轻松执行终端命令。
  • 能够熟练使用和调试 Node.js 和 JavaScript。

好主意💡:以后你可以在 AWS SAM 或 AWS CDK 项目中使用这个示例。比如这个AWS CDK Node.JS:Hello World

好的,我们开始吧!

创建 Slack 应用频道

首先,您需要预先确定使用哪个 Slack 应用频道来接收传入消息。例如,您可以使用现有频道(例如 #random),也可以创建一个新频道。在本例中,我将使用 #my-test-app 命名约定。请参阅下图以供参考。

选择频道

创建 Slack 应用程序

要从外部应用程序(例如您的网站或移动应用程序)接收消息,您必须配置您的 Slack“API 应用程序”设置。

登录你的 Slack 帐户,并导航至 Slack API 门户的“你的应用”页面。复制粘贴此链接即可立即跳转至:https://api.slack.com/apps

如果这是您第一次创建 Slack 帐户,您的“应用”列表将为空。否则,您将看到 API 应用列表。

创建应用程序

接下来,点击“创建新应用程序”“创建应用程序”绿色按钮,打开“创建应用程序”模式窗口。

选择从头开始选项。

从零开始

在“应用名称”,输入你的应用名称。我在本例中用的是“Send Me Tacos”,但你也可以选择任何你喜欢的名称。:)

接下来,使用下拉菜单找到您想要发送消息的工作区。工作区是您创建的帐户的名称。在本例中,我将其命名为“Taco Paradise”。

你能看出我在想美味的食物吗?

完成后,点击“创建应用”。最后一步将带您进入一个新页面。请参阅图片以供参考。

创建应用程序

创建新应用后,请停留在同一页面,向下滚动到左侧菜单列表中找到“传入 Webhooks”链接。点击该链接即可显示 Webhook 配置页面。请注意,“激活传入 Webhooks”旁边的选项已设置为“关闭”。

点击该开关以启用它。它应该会变成绿色并显示“On”字样。

应用程序名称

做得好!

创建 Webhook

最后,点击“将新的 Webhook 添加到工作区”按钮,创建一个 Webhook URL。此步骤将打开一个新窗口。

在新窗口中,注意“测试应用程序需要一个频道作为应用程序发布”的位置,单击下拉菜单并选择要发送消息的频道。

注意:我们在教程开始时提到过此步骤。在本例中,我选择了 #my-test-app。

现在,您可以试用一下新的 Webhook URL。使用您常用的终端应用程序或 API 客户端,将您的示例 curl 请求复制粘贴到 API 客户端或终端中,然后执行相应的命令。

注意:将 webhook URL 替换为您的 URL。



curl -X POST -H 'Content-type: application/json' --data '{"text":"Hello, World!"}' https://hooks.slack.com/services/5CKKM62NX5J/8G8XMGQ3RXM/aadCZ8act32sLJ7dgaC8HLrx


Enter fullscreen mode Exit fullscreen mode

执行命令后,导航回 Slack 应用程序、网络或移动设备并注意新消息“Hello, World!”。


酷了!!!

你好世界

您可能不会立即注意到,但发生了两件事。1)您的令人难以置信的消息显示在 Slack 应用程序中,2)您的 Slack API 应用程序现已集成到 Slack 应用程序中。

很酷的想法💡:您可以使用 Postman 和 Insomnia API 客户端来测试和制作 Slack webhook 和 AWS 函数 URL 的原型。;)

您可以在这里停下来并结束一天的工作,但如果您想灵活处理,请继续下一部分。

创建 AWS Lambda 函数 URL

好的!

让我们将本教程提升到一个新的水平。在下一部分中,我将向您展示如何创建和配置 AWS Lambda 函数 URL,以便使用 Slack 传入 Webhook。😃

此外,我们将使用 AWS 命令​​行界面创建称为角色和策略的 AWS 身份权限,以允许函数 URL 正常工作。

如果您需要复习,请访问此处的AWS IAM 文档。

准备好了吗?出发!

创建 AWS IAM 角色

首先,我们需要获取你的 ARN,它是 AWS 特定格式的字符串。类似如下:

arn:aws:iam::123456789123:用户/用户名

要访问它,我们可以在终端中执行以下 AWS CLI 命令,如下所示:

注意:将 Paulo 更改为您的用户名



$ aws iam get-user --user-name Paulo


Enter fullscreen mode Exit fullscreen mode

响应应类似于下面的 JSON 文本。请将文本保存到某个位置以供稍后引用,或者您可以重新运行该命令。



$ {
    "User": {
        "UserName": "Paulo",
        "Path": "/",
        "CreateDate": "2019-09-21T23:03:13Z",
        "UserId": "AIDA123456789EXAMPLE",
        "Arn": "arn:aws:iam::123456789012:user/Paulo"
    }
}


Enter fullscreen mode Exit fullscreen mode

将 AWS 策略附加到 IAM 角色

接下来,创建一个名为trust-policy.json的文件



// trust-policy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}


Enter fullscreen mode Exit fullscreen mode

在此处暂停并将角色名称function-url-role更改为其他名称或保留它直到创建另一个角色名称。

准备好后,打开终端或命令提示符,复制粘贴以下命令,然后按 Enter。



$ aws iam create-role --role-name function-url-role --assume-role-policy-document file://trust-policy.json


Enter fullscreen mode Exit fullscreen mode

成功的响应将返回更多 JSON 文本。

下一步将把 AWSLambdaBasicExecutionRole 策略附加到您新创建的 IAM 角色。此策略授予您运行函数的基本用户权限。

继续复制粘贴下面的命令并将其执行到您的终端应用程序中。

请记住将函数角色名称替换为您的。在本例中为function-url-role



$ aws iam attach-role-policy --role-name function-url-role --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole


Enter fullscreen mode Exit fullscreen mode

创建 AWS 函数 URL

在本节中,您将创建和配置 AWS Lambda 函数,并通过一些基本设置启用新的函数 URL 功能。

首先,我们需要访问 ARN 角色字符串。为此,请执行以下 AWS CLI 命令。



$ aws iam get-role --role-name function-url-role


Enter fullscreen mode Exit fullscreen mode

响应输出应该返回一些类似于以下文本的 JSON。

暂停一秒钟,找到类似于此文本arn:aws:iam::123456789012:role/my-function-url 的“Arn”字符串值,并将其保存在某处以供日后使用。



// terminal JSON ouput
{
    "Role": {
        "Path": "/",
        "RoleName": "my-function-url",
        "RoleId": "AIDA123456789EXAMPLE",
        "Arn": "arn:aws:iam::123456789012:role/my-function-url",
        "CreateDate": "2022-04-16T22:32:36+00:00",
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Principal": {
                        "Service": "lambda.amazonaws.com"
                    },
                    "Action": "sts:AssumeRole"
                }
            ]
        },
        "Description": "Allows Lambda functions to call AWS services on your behalf.",
        "MaxSessionDuration": 3600,
        "RoleLastUsed": {
            "LastUsedDate": "2022-04-30T00:29:38+00:00",
            "Region": "us-west-2"
        }
    }
}


Enter fullscreen mode Exit fullscreen mode

准备文件

在创建 AWS Lambda 函数之前,您需要准备一些代码,执行一些 AWS CLI 命令,并最终部署项目进行实时测试。在本例中,我们将使用 JavaScript 的 Node.js 代码。

首先,创建一个名为index.js的文件,然后准备编辑该文件。使用您常用的终端应用运行以下命令,或者您也可以手动修改它。



$ touch index.js && vim index.js


Enter fullscreen mode Exit fullscreen mode

接下来,将以下 JavaScript 代码复制粘贴到终端的 vim 编辑会话中,或者使用您常用的代码编辑器。请确保将<-- YOUR WEBHOOK GOES HERE -->处的“字符串”替换为您的 Slack API webhook URL。

例如,从这个:

路径:'<-- 你的 WEBHOOK 在此处 -->'

对此

路径:'/services/T02S60H1F0Q/B03DH5L14S1/CPHv2eu0ctGgB​​9g99DNZiNCi'



// index.js
const https = require('https');

const postRequest = (a) => {
    const payload = { "text": `${a}` };

    const data = JSON.stringify(payload);

    const options = {
        hostname: 'hooks.slack.com',
        path: '<-- YOUR WEBHOOK  GOES HERE -->',
        port: 443,
        method: 'POST',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
            'Content-Length': data.length
        }
    };

    return new Promise((resolve, reject) => {
        const req = https.request(options, res => {
            let rawData = '';

            res.on('data', chunk => {
                rawData += chunk;
            });

            res.on('end', () => {
                resolve({
                    statusCode: 200,
                    body: `${rawData}`
                });
            });
        });

        req.on('error', err => {
            reject(new Error(err));
        });

        req.write(data);
        req.end();
    });
};

exports.handler = async (event) => {

    let body = JSON.parse(event.body);
    const result = await postRequest(body.text);

    const response = {
        statusCode: 200,
        body: result,
    };
    return response;
};


Enter fullscreen mode Exit fullscreen mode

最后,使用以下命令或手动压缩您的文件。



$ zip function.zip index.js


Enter fullscreen mode Exit fullscreen mode

您将在以下部分中使用 AWS CLI 创建 AWS Lambda 函数。

创建 AWS Lambda 函数

暂停一下。想一下你的新函数的名字。在这个例子中,我使用了my-url-function

还记得之前保存的 ARN 字符串吗?请用您的 ARN 字符串替换它。

例如,从这个:

--role [此处输入您的 ARN]

对此

--role arn:aws:iam::123456789012:role/my-function-url

准备好后,在终端中复制粘贴并执行以下命令:



$ aws lambda create-function \
    --function-name my-url-function \
    --runtime nodejs14.x \
    --zip-file fileb://function.zip \
    --handler index.handler \
    --role [YOUR ARN GOES HERE]


Enter fullscreen mode Exit fullscreen mode

输出应返回包含您的 AWS Lambda 函数详细信息的扩展 JSON 响应。

您可以在终端中使用以下命令来验证您的 lambda 函数是否已创建。



$ awd lambda get-functionn --function-name my-url-function


Enter fullscreen mode Exit fullscreen mode

启用 AWS 函数 URL

传统上,您必须经过十几个步骤才能使用 AWS Lambda、API Gateway 创建一个简单的端点,在创建安全端点时也是如此,但现在有更好的方法。

执行以下命令,并记得用你的函数名称替换它。

从此:

--function-name 你的函数名称 \

对此:

--函数名称 my-url-函数 \



$ aws lambda create-function-url-config \
    --function-name YOUR-FUNCTION-NAME \
    --auth-type NONE \
    --cors '{"AllowOrigins": ["*"],"AllowCredentials": false}'


Enter fullscreen mode Exit fullscreen mode

注意:本演示的链接是公开的。您有责任在所有生产环境中确保端点的安全。

测试您的 AWS 函数 URL

现在到了您期待已久的时刻。在终端中使用以下命令并执行。



$ curl -X POST \
    '<YOUR FUNCTION URL GOES HERE>' \
    -H 'Content-Type: application/json' \
    -d '{"text": "Feed me Seymour!"}'


Enter fullscreen mode Exit fullscreen mode

成功的响应应该返回一些类似于下面的 JSON 文本。



$ {"body":"ok","statusCode":200}


Enter fullscreen mode Exit fullscreen mode

如果成功,您应该会在 Slack 应用程序频道中看到另一条消息,其中包含文字“Feed me, Seymour!”。

结论

就是这样!

我希望您能够提高一些 AWS Cloud Serverless 技能并享受本教程。

感谢您能读到这里,希望下次还能见到您!

鏂囩珷鏉ユ簮锛�https://dev.to/josuebustos/post-messages-to-slack-using-aws-lambda-function-urls-5f2a
PREV
3 个鲜为人知但实用的 Vim 技巧
NEXT
将 Google AdMob 添加到 Expo Apps