3
0

More than 1 year has passed since last update.

Lambda(Node.js)で別アカウントのECSサービス情報を取得する

Last updated at Posted at 2022-03-01

はじめに

Node.jsを使ってスイッチロールして別アカウントのECS情報を取得する際に実装方法が分からなかったので、備忘として残しておきます。
Lambda+Node.jsの情報少なすぎひん...?

設定内容

権限設定

Lambdaを作成する前に以下の設定だけ先にやっておきます。
色々試しながらだったので、もしかしたら漏れがあるかもしれません。

  • アクセス元のIAMロールにAssumeRole権限追加
  • アクセス先のIAMロールにECSへのアクセス権限追加(ECSFullAccess)
  • アクセス先のIAMロールの信頼関係にアクセス元のIAMロールを追加

Lambda実装

初めてNode.js書くので不要な実装とか含まれているかもしれませんが、実際に実装したプログラムは以下です。
普段Pythonしか書かないのでcallbackとか全然頭に入ってこなかった。。

const AWS = require('aws-sdk');
const sts = new AWS.STS({apiVersion:'2011-06-15',region:'ap-northeast-1'});
const roleArn = "arn:aws:iam::123456789123:role/service-role/switch_role_name"
const roleSessionName = "test"

exports.handler = (event) => {
    var params_sts = {
        RoleArn: roleArn,
        RoleSessionName: roleSessionName
    };
    
    sts.assumeRole(params_sts, function(err, data) {
        if (err) {
            console.log(err, err.stack);
        } else {
            var accesskey = data.Credentials.AccessKeyId;
            var secretaccesskey = data.Credentials.SecretAccessKey;
            var SessionToken = data.Credentials.SessionToken
            
            const ecs = new AWS.ECS({apiVersion:'2014-11-13',region:'ap-northeast-1',accessKeyId: accesskey,secretAccessKey: secretaccesskey, sessionToken: SessionToken});
            
            var params = {
                services: [
                    "service_name"
                ],
                cluster: "cluster_name"
            };
            ecs.describeServices(params, function(err, data) {
                if (err) console.log(err, err.stack);
                else     console.log(data);
            });
        }
    });
};

実行結果

以下のような実行結果が取得されました。

{
  services: [
    {
      serviceArn: 'arn:aws:ecs:ap-northeast-1:123456789123:service/cluster_name/service_name',
      serviceName: 'service_name',
      clusterArn: 'arn:aws:ecs:ap-northeast-1:123456789123:cluster/cluster_name',
      loadBalancers: [],
      serviceRegistries: [],
      status: 'ACTIVE',
      desiredCount: 0,
      runningCount: 0,
      pendingCount: 0,
      launchType: 'FARGATE',
      platformVersion: 'LATEST',
      platformFamily: 'Linux',
      taskDefinition: 'arn:aws:ecs:ap-northeast-1:123456789123:task-definition/sample-task:1',
      deploymentConfiguration: [Object],
      deployments: [Array],
      roleArn: 'arn:aws:iam::123456789123:role/aws-service-role/ecs.amazonaws.com/AWSServiceRoleForECS',
      events: [Array],
      createdAt: 2022-03-01T01:18:27.525Z,
      placementConstraints: [],
      placementStrategy: [],
      networkConfiguration: [Object],
      schedulingStrategy: 'REPLICA',
      createdBy: 'arn:aws:iam::123456789123:user/user1',
      enableECSManagedTags: true,
      propagateTags: 'NONE',
      enableExecuteCommand: false
    }
  ],
  failures: []
}

おわりに

Node.jsのわからな過ぎてかなりハマってました。
あとはLambdaでSDKを利用する場合は、SDKのバージョンが2系になるのですが、Googleで調べると3系が多く出てきていて最初はその違いに気づくのに時間がかかりました。。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0