はじめに
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系が多く出てきていて最初はその違いに気づくのに時間がかかりました。。