从 Lambda 函数(Java 运行时)发布 SNS 消息
publish SNS message from Lambda Function(Java Runtime)
我正在尝试从我的 java lambda 函数向 SNS 主题发布消息,但函数超时。
我从我编写的逻辑中获得了我需要的数据,但在将数据作为 SNS 消息发送时超时。
我已授予对我的 lambda 函数的完全访问权限以发布 SNS 消息。
这是代码。
AmazonSNS client = AmazonSNSClientBuilder.defaultClient();
String resultIs = "Testing Lambda";
final PublishRequest publishRequest = new PublishRequest("my_SNS_Topic_ARN", resultIs, "Testing email");
logger.log(" publishing message ");
//it's timing out here
final PublishResult publishResponse = client.publish(publishRequest);
我也试过这样构建 SNS 客户端,但没有成功。
AmazonSNSClientBuilder builder = AmazonSNSClientBuilder.standard().withCredentials(new DefaultAWSCredentialsProviderChain());
builder.setRegion(System.getenv("Region"));
AmazonSNS amazonSNS = builder.build();
我需要提供凭据吗?有什么简单的方法可以构建客户端并从 lambda java 函数发布到 SNS 主题。
这个方法我也试过了,超时了
AmazonSNS client = AmazonSNSClientBuilder.standard().build();
client.publish("arn:aws:sns:***", "Test","Data");
将计时器增加到 1 分钟并使用上面的代码后出现异常。
tp.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:744)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:726)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access0(AmazonHttpClient.java:686)
at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:668)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:532)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:512)
at com.amazonaws.services.sns.AmazonSNSClient.doInvoke(AmazonSNSClient.java:2800)
at com.amazonaws.services.sns.AmazonSNSClient.invoke(AmazonSNSClient.java:2767)
at com.amazonaws.services.sns.AmazonSNSClient.invoke(AmazonSNSClient.java:2756)
at com.amazonaws.services.sns.AmazonSNSClient.executePublish(AmazonSNSClient.java:1974)
at com.amazonaws.services.sns.AmazonSNSClient.publish(AmazonSNSClient.java:1946)
at com.amazonaws.services.sns.AmazonSNSClient.publish(AmazonSNSClient.java:1991)
at jdbcsample.JDBCSample.getCurrentTime(JDBCSample.java:155)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
Caused by: org.apache.http.conn.ConnectTimeoutException: Connect to sns.us-east-1.amazonaws.com:443 [sns.us-east-1.amazonaws.com/52.46.136.210] failed: connect timed out
at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:151)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:374)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.amazonaws.http.conn.ClientConnectionManagerFactory$Handler.invoke(ClientConnectionManagerFactory.java:76)
at com.amazonaws.http.conn.$Proxy3.connect(Unknown Source)
at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:393)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56)
at com.amazonaws.http.apache.client.impl.SdkHttpClient.execute(SdkHttpClient.java:72)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1297)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1113)
... 18 more
Caused by: java.net.SocketTimeoutException: connect timed out
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:368)
at com.amazonaws.http.conn.ssl.SdkTLSSocketFactory.connectSocket(SdkTLSSocketFactory.java:142)
at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:142)
... 34 more
END RequestId: cc9a0689-2a17-4061-adab-10043366f2e6
REPORT RequestId: cc9a0689-2a17-4061-adab-10043366f2e6 Duration: 49021.54 ms
Billed Duration: 49100 ms Memory Size: 512 MB Max Memory Used: 139 MB Init
Duration: 335.45 ms
要在 lambda 函数中创建 sns 客户端,行 AmazonSNSClientBuilder.standard().build()
就足够了。
确保 lambda 执行角色具有附加策略
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"sns:Publish"
],
"Resource": "arn:aws:sns:*:*:*"
}
]
}
从 SNS 控制台为您的主题复制正确的 arn。如果您没有主题,请创建一个。
我的工作示例是
AmazonSNS client = AmazonSNSClientBuilder.standard().build();
client.publish("arn:aws:sns:eu-central-1:0xxxxx:xxxxxx", "I'm a test message", "Test Message");
如果您还没有增加 Lambda 函数的超时值,那可能值得一看。默认值为 3 秒,但最多可增加到 15 分钟。
您确定您的函数没有部署在 VPC 中吗
并且您的 SNS 主题具有正确的访问策略? (在 SNS 控制台中查看)
{
"Version": "2008-10-17",
"Id": "__default_policy_ID",
"Statement": [
{
"Sid": "__default_statement_ID",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": [
"SNS:GetTopicAttributes",
"SNS:SetTopicAttributes",
"SNS:AddPermission",
"SNS:RemovePermission",
"SNS:DeleteTopic",
"SNS:Subscribe",
"SNS:ListSubscriptionsByTopic",
"SNS:Publish",
"SNS:Receive"
],
"Resource": "arn:aws:sns:eu-central-1:0xxxxxxxxxxxx:xxxxxxxxxx",
"Condition": {
"StringEquals": {
"AWS:SourceOwner": "xxxxxxxxxxx"
}
}
}
]
}
我正在尝试从我的 java lambda 函数向 SNS 主题发布消息,但函数超时。 我从我编写的逻辑中获得了我需要的数据,但在将数据作为 SNS 消息发送时超时。 我已授予对我的 lambda 函数的完全访问权限以发布 SNS 消息。 这是代码。
AmazonSNS client = AmazonSNSClientBuilder.defaultClient();
String resultIs = "Testing Lambda";
final PublishRequest publishRequest = new PublishRequest("my_SNS_Topic_ARN", resultIs, "Testing email");
logger.log(" publishing message ");
//it's timing out here
final PublishResult publishResponse = client.publish(publishRequest);
我也试过这样构建 SNS 客户端,但没有成功。
AmazonSNSClientBuilder builder = AmazonSNSClientBuilder.standard().withCredentials(new DefaultAWSCredentialsProviderChain());
builder.setRegion(System.getenv("Region"));
AmazonSNS amazonSNS = builder.build();
我需要提供凭据吗?有什么简单的方法可以构建客户端并从 lambda java 函数发布到 SNS 主题。
这个方法我也试过了,超时了
AmazonSNS client = AmazonSNSClientBuilder.standard().build();
client.publish("arn:aws:sns:***", "Test","Data");
将计时器增加到 1 分钟并使用上面的代码后出现异常。
tp.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:744)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:726)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access0(AmazonHttpClient.java:686)
at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:668)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:532)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:512)
at com.amazonaws.services.sns.AmazonSNSClient.doInvoke(AmazonSNSClient.java:2800)
at com.amazonaws.services.sns.AmazonSNSClient.invoke(AmazonSNSClient.java:2767)
at com.amazonaws.services.sns.AmazonSNSClient.invoke(AmazonSNSClient.java:2756)
at com.amazonaws.services.sns.AmazonSNSClient.executePublish(AmazonSNSClient.java:1974)
at com.amazonaws.services.sns.AmazonSNSClient.publish(AmazonSNSClient.java:1946)
at com.amazonaws.services.sns.AmazonSNSClient.publish(AmazonSNSClient.java:1991)
at jdbcsample.JDBCSample.getCurrentTime(JDBCSample.java:155)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
Caused by: org.apache.http.conn.ConnectTimeoutException: Connect to sns.us-east-1.amazonaws.com:443 [sns.us-east-1.amazonaws.com/52.46.136.210] failed: connect timed out
at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:151)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:374)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.amazonaws.http.conn.ClientConnectionManagerFactory$Handler.invoke(ClientConnectionManagerFactory.java:76)
at com.amazonaws.http.conn.$Proxy3.connect(Unknown Source)
at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:393)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56)
at com.amazonaws.http.apache.client.impl.SdkHttpClient.execute(SdkHttpClient.java:72)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1297)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1113)
... 18 more
Caused by: java.net.SocketTimeoutException: connect timed out
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:368)
at com.amazonaws.http.conn.ssl.SdkTLSSocketFactory.connectSocket(SdkTLSSocketFactory.java:142)
at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:142)
... 34 more
END RequestId: cc9a0689-2a17-4061-adab-10043366f2e6
REPORT RequestId: cc9a0689-2a17-4061-adab-10043366f2e6 Duration: 49021.54 ms
Billed Duration: 49100 ms Memory Size: 512 MB Max Memory Used: 139 MB Init
Duration: 335.45 ms
要在 lambda 函数中创建 sns 客户端,行 AmazonSNSClientBuilder.standard().build()
就足够了。
确保 lambda 执行角色具有附加策略
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"sns:Publish"
],
"Resource": "arn:aws:sns:*:*:*"
}
]
}
从 SNS 控制台为您的主题复制正确的 arn。如果您没有主题,请创建一个。
我的工作示例是
AmazonSNS client = AmazonSNSClientBuilder.standard().build();
client.publish("arn:aws:sns:eu-central-1:0xxxxx:xxxxxx", "I'm a test message", "Test Message");
如果您还没有增加 Lambda 函数的超时值,那可能值得一看。默认值为 3 秒,但最多可增加到 15 分钟。
您确定您的函数没有部署在 VPC 中吗
并且您的 SNS 主题具有正确的访问策略? (在 SNS 控制台中查看)
{
"Version": "2008-10-17",
"Id": "__default_policy_ID",
"Statement": [
{
"Sid": "__default_statement_ID",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": [
"SNS:GetTopicAttributes",
"SNS:SetTopicAttributes",
"SNS:AddPermission",
"SNS:RemovePermission",
"SNS:DeleteTopic",
"SNS:Subscribe",
"SNS:ListSubscriptionsByTopic",
"SNS:Publish",
"SNS:Receive"
],
"Resource": "arn:aws:sns:eu-central-1:0xxxxxxxxxxxx:xxxxxxxxxx",
"Condition": {
"StringEquals": {
"AWS:SourceOwner": "xxxxxxxxxxx"
}
}
}
]
}