我想通过erlang的公共库erlcloud访问SQS服务。到目前为止我有以下内容:
`
-module(server).
-export([start/0, loop/1, handle_sqs_request/1]).
start() ->
application:set_env(erlcloud, aws_access_key_id, os:getenv("AWS_ACCESS_KEY_ID")),
application:set_env(erlcloud, aws_secret_access_key, os:getenv("AWS_SECRET_ACCESS_KEY")),
application:set_env(erlcloud, aws_region, os:getenv("AWS_REGION")),
application:ensure_all_started(erlcloud),
spawn(fun() -> loop("queueurl") end).
loop(QueueUrl) ->
io:format("Fetching messages from queue: ~s~n", [QueueUrl]),
handle_sqs_request(QueueUrl),
timer:sleep(5000), % Wait for 5 seconds before checking again
loop(QueueUrl).
handle_sqs_request(QueueUrl) ->
io:format("Processing messages from queue: ~s~n", [QueueUrl]),
Options = #{max_number_of_messages => 10},
io:format("Options being passed: ~p~n", [Options]),
case erlcloud_sqs:receive_message(QueueUrl, Options) of
{ok, Messages} ->
io:format("Raw messages received: ~p~n", [Messages]),
lists:foreach(fun(Msg) ->
case maps:get(<<"receipt_handle">>, Msg, undefined) of
undefined ->
io:format("No receipt handle found in message: ~p~n", [Msg]);
ReceiptHandle ->
io:format("Deleting message with receipt handle: ~s~n", [ReceiptHandle]),
erlcloud_sqs:delete_message(QueueUrl, ReceiptHandle)
end
end, Messages),
ok;
{error, Reason} ->
io:format("Error receiving messages: ~p~n", [Reason])
end.
`
并且在 rebar3 shell 之后出现以下错误:
1> server:start().
Fetching messages from queue: queurl
<0.226.0>
Processing messages from queue: queuurl
Options being passed: #{max_number_of_messages => 10}
=ERROR REPORT==== 11-Dec-2024::17:07:24.378596 ===
Error in process <0.226.0> with exit value:
{function_clause,
[{erlcloud_sqs,receive_message,
["queurul",
#{max_number_of_messages => 10},
1,none,none,
[all],
this is my rebar.config
{erl_opts, [debug_info]}.
{deps, [
{erlcloud, {git, "https://github.com/erlcloud/erlcloud.git", {branch, "master"}}}
]}.
{shell, [
{apps, [appname]}
]}.
` aws 凭证正在从环境变量中正确加载,并与我的 aws 配置中的凭证相匹配,而且用户也拥有与 sqs 服务交互的正确权限。 queurl 是硬编码的,但在本示例中,出于安全目的,我将其切换为“queurl”。我使用的是最新版本的 erlcloud,但是我似乎与 erlcloud 集成的正确语法不匹配。
有人可以帮助我吗?谢谢!
我尝试来回更改所使用的handle_sqs_request的语法。
我尝试了旧版本的erlcloud,但也不匹配。在我的 CLI 中,我正确地从 SQS 发送和获取消息,因此问题肯定存在于代码中。
函数
erlcloud_sqs:receive_message
可以使用不同数量的参数来调用,从 1 到 7。 据我所知,如果您想指定最大消息数,则需要使用三参数消息。它需要以下参数:
all
aws_config
记录所以这可能有效:
erlcloud_sqs:receive_message(QueueUrl, all, 10)