やりたいこと

アクセスキーなどで直接リソースにアクセスできない環境から、JavaScriptAWS のリソースを操作したい。 AWS CLI であればassume-roleを使うが、簡単なラッパーがないかを調べた。

やり方

aws-sdk-js には credential-provider があり認証が簡単に行える。 sts:AssumeRole するには fromTemporaryCredentials で、他にもEC2インスタンスメタデータを使う fromInstanceMetadata や、Lambda 実行時に自動でセットされる AWS_ACCESS_KEY_ID などを使う fromEnv といったものもある。

export * as ecr from "npm:@aws-sdk/client-ecr@3.511.0";
export { fromTemporaryCredentials } from "npm:@aws-sdk/credential-providers@3.511.0";
import { ecr, fromTemporaryCredentials } from "./deps.ts";
 
function getStsCredentialProvider(
  account: string,
  region: string,
  role: string,
  sessionName: string,
) {
  return fromTemporaryCredentials({
    params: {
      RoleArn: `arn:aws:iam::${account}:role/${role}`,
      RoleSessionName: sessionName,
      DurationSeconds: 600,
    },
    clientConfig: {
      region,
    },
  });
}
 
export function createClients(
  account: string,
  region: string,
  role: string,
  sessionName: string,
) {
  const credProvider = getStsCredentialProvider(
    account,
    region,
    role,
    sessionName,
  );
  const ecrClient = new ecr.ECRClient({
    region,
    credentials: credProvider,
  });
 
  return {
    ecrClient,
  };
}