なぜ私のコードではなく、AWSラムダ関数では、標準のNode.jsのファイルで実行できますか?

III:

私は何をしようとしていることは関数がEC2インスタンス上の2つのコマンドを呼び出すラムダ関数を作成することです。私はラムダ関数でこのコードを実行するトラブルがあったとき、私はexports.handler()メソッドからコードを削除し、同じEC2インスタンスにスタンドアロンNode.jsのファイル内のコードを実行し、私は仕事にコードを取得することができました。コマンドIのRANは、「ノードapp.js」でした。

exports.handler = async (event) => {

  const AWS = require('aws-sdk')
  AWS.config.update({region:'us-east-1'});

  var ssm = new AWS.SSM();

  var params = {
  DocumentName: 'AWS-RunShellScript', /* required */
  InstanceIds: ['i-xxxxxxxxxxxxxxxx'],
  Parameters: {
    'commands': [
      'mkdir /home/ec2-user/testDirectory',
      'php /home/ec2-user/helloWorld.php'
      /* more items */
    ],
    /* '<ParameterName>': ... */
  }
};
ssm.sendCommand(params, function(err, data) {
  if (err) {
    console.log("ERROR!");
    console.log(err, err.stack); // an error occurred
  }
  else {
  console.log("SUCCESS!");
  console.log(data);
  }            // successful response
});


  const response = {
    statusCode: 200,
    ssm: ssm
  };

  return response;
}; 

私はそれが権限関連の問題だったかもしれないことを考え出したが、ラムダは、EC2インスタンスが入っていることを離れて同じVPCのです。

ラムダ関数からの出力:

{
  "statusCode": 200,
  "ssm": {
    "config": {
      "credentials": {
        "expired": false,
        "expireTime": null,
        "refreshCallbacks": [],
        "accessKeyId": "xxxxxxxxxxxxxxxxxxxxx",
        "sessionToken": "...",
        "envPrefix": "AWS"
      },
      "credentialProvider": {
        "providers": [
          null,
          null,
          null,
          null,
          null,
          null,
          null
        ],
        "resolveCallbacks": []
      },
      "region": "us-east-1",
      "logger": null,
      "apiVersions": {},
      "apiVersion": null,
      "endpoint": "ssm.us-east-1.amazonaws.com",
      "httpOptions": {
        "timeout": 120000
      },
      "maxRedirects": 10,
      "paramValidation": true,
      "sslEnabled": true,
      "s3ForcePathStyle": false,
      "s3BucketEndpoint": false,
      "s3DisableBodySigning": true,
      "s3UsEast1RegionalEndpoint": "legacy",
      "computeChecksums": true,
      "convertResponseTypes": true,
      "correctClockSkew": false,
      "customUserAgent": null,
      "dynamoDbCrc32": true,
      "systemClockOffset": 0,
      "signatureVersion": "v4",
      "signatureCache": true,
      "retryDelayOptions": {},
      "useAccelerateEndpoint": false,
      "clientSideMonitoring": false,
      "endpointDiscoveryEnabled": false,
      "endpointCacheSize": 1000,
      "hostPrefixEnabled": true,
      "stsRegionalEndpoints": "legacy"
    },
    "isGlobalEndpoint": false,
    "endpoint": {
      "protocol": "https:",
      "host": "ssm.us-east-1.amazonaws.com",
      "port": 443,
      "hostname": "ssm.us-east-1.amazonaws.com",
      "pathname": "/",
      "path": "/",
      "href": "https://ssm.us-east-1.amazonaws.com/"
    },
    "_events": {
      "apiCallAttempt": [
        null
      ],
      "apiCall": [
        null
      ]
    },
    "_clientId": 2
  }
}
ジェイソン・ワズワース:

あなたはコンバインしようとしているasync/ awaitコールバックで。それはラムダでは動作しませんNode.jsの中AWSラムダ関数ハンドラその理由は、それがローカルに作業し、または関数が終了するが、そうコールバックがまだ発生したときに、サーバーがまだ実行されているため、ノードサーバに、あるです。あなたが使用している場合、ラムダでは、ノードのプロセスはすぐにラムダ終了などとして行っているasync(または約束)、そのコールバックは解雇できません。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=20137&siteId=1
おすすめ