12

Lambda 関数呼び出しから一部のデータを SNS に公開しようとしていますが、機能していないようです。私の機能コードは -

public class Handler implements RequestHandler<DynamodbEvent, Void> {

    private static final String SNS_TOPIC_ARN = "arn:aws:sns:us-west-2:account_number:function_name";

    @Override
    public Void handleRequest(DynamodbEvent dynamodbEvent, Context context) {

        LambdaLogger logger = context.getLogger();

        AmazonSNSClient snsClient = new AmazonSNSClient(new DefaultAWSCredentialsProviderChain());
        snsClient.setRegion(Region.getRegion(Regions.US_WEST_2));

        for (DynamodbStreamRecord record : dynamodbEvent.getRecords()) {
            Map<String, AttributeValue> newImage = record.getDynamodb().getNewImage();

            if (newImage == null) {
                continue;
            }

            String sensorId = newImage.get("sensorID").getS();
            long timestamp = Long.parseLong(newImage.get("timestamp").getS());
            double temperature = Double.parseDouble(newImage.get("payload").getM().get("temp").getN());

            String data = sensorId + " " + timestamp + " " + temperature;

            logger.log(data);

            PublishRequest publishRequest = new PublishRequest(SNS_TOPIC_ARN, data);

            PublishResult publishResult = snsClient.publish(publishRequest);

            logger.log("Publish Successful " + publishResult.getMessageId());
        }

        snsClient.shutdown();

        return null;
    }
}

この呼び出しはタイムアウト (10 秒) になり、ラムダ呼び出しは失敗します。SNS 公開部分をコメントアウトすると、つまり、DynamoDB から受信したデータをログに記録するだけで問題なく動作します。SNS公開コードを追加した途端にタイムアウト。

CloudWatch に記録されたタイムアウト メッセージは -

START RequestId: 8db74187-459b-42c5-8a06-b3a74873b236 Version: $LATEST END RequestId: 8db74187-459b-42c5-8a06-b3a74873b236 REPORT RequestId: 8db74187-459b-42c5-8a06-b3a74873b236 Duration: 10001.66 ms Billed Duration: 10000 ms Memory Size: 128 MB Max Memory Used: 37 MB Task timed out after 10.00 seconds

すべての適切な権限があり、PC で次のコードを実行するだけで SNS に公開できます -

PublishRequest publishRequest = new PublishRequest(SNS_TOPIC_ARN, data);
PublishResult publishResult = snsClient.publish(publishRequest);
System.out.println("Publish Successful " + publishResult.getMessageId());

AmazonSNSAsyncClientの代わりに使用してみAmazonSNSClientましたが、同じ結果が得られます。

ここで何が欠けていますか?

4

3 に答える 3

10

さて、私の質問にコメントした人は誰も答えていないので、私は自分で答えます。

メモリ使用量を 256 MB に増やし、タイムアウトを 30 秒に増やすと、問題が解決したようです。

于 2015-12-31T05:44:41.000 に答える
0

ラムダ関数に割り当てられたメモリを増やすことも私にとってはうまくいきました(この設定はラムダコンソールの基本設定にあります)。

これは私にとって腹立たしいものでした.2つの異なるラムダ関数に同じ構成で同じJARファイルを使用していましたが、SNS呼び出しは一方では機能していましたが、もう一方ではタイムアウトしていました。めんどくさい!

于 2018-12-25T16:38:42.247 に答える