EC2に割り当てられたIAM Roleのcredential情報からAccessKeyId, SecretAccesskeyを取得するgulp task


EC2インスタンスに割り当てられたIAM Role権限で、EC2上でgulp.taskを動作させる場合の一時AccessKeyId, SecretAccessKeyの取得方法.

gulpの拡張タスクなどで、accessKeyId, SecretAccessKeyを指定するよう要求されるtaskがあります。IAM ユーザとしてアクセスキー等が発行されていない場合でも、EC2インスタンスに割り当てられたIAM Roleから一時アクセスキーを取得し、実行することができるようになります。

var AWS = require("aws-sdk");

gulp.task('updateCredentials', function() {
  return new Promise((resolve, reject)=>{
    var metadata = new AWS.MetadataService();
      metadata.request('/latest/meta-data/iam/security-credentials/',function(err,rolename){
        if(err) reject(err);
        // console.log(rolename);
        metadata.request('/latest/meta-data/iam/security-credentials/'+rolename,function(err,data) {
          if(err) reject(err);
          // console.log(data);
          var credentials = JSON.parse(data);
          AWS.config.update({
            accessKey: credentials.AccessKeyId,
            secretAccessKey: credentials.SecretAccessKey,
            sessionToken: credentials.Token,
          });
          console.log('update credentials.');
          resolve();
        });
    });
  });
});

gulpで直せすaccessKeyId, SecretAccessKeyを参照する必要がない場合は、以下のような方法で
credentialsを更新します。

gulp.task('updateCredentialsEC2', function() {
  AWS.config.credentials = new AWS.EC2MetadataCredentials({
    // httpOptions: { timeout: 5000 }, // 5 second timeout
    // maxRetries: 10, // retry 10 times
    // retryDelayOptions: { base: 200 } // see AWS.Config for information
  });
  AWS.config.credentials.refresh(function() {
    return Promise.resolve();
  });
});