Blog

Aufbau eines AWS CDK Credential Providers

Thomas de Ruiter

Aktualisiert Oktober 21, 2025
4 Minuten

Wenn Sie in einer Umgebung mit mehreren Konten mit dem AWS Cloud Development Kit (CDK) arbeiten, muss das CDK in der Lage sein, die entsprechenden Anmeldeinformationen zu erhalten. Wir zeigen Ihnen, wie Sie ein Credential Provider Plugin für das CDK schreiben.

Eine CDK App kann aus mehreren Stacks bestehen. Jeder der Stacks kann mit einer AWS Region und einer Konto-ID versehen werden. Bei der Bereitstellung stellt das CDK sicher, dass die Stacks für das richtige Konto und die richtige Region bereitgestellt werden.

Wenn Sie nichts Besonderes tun, prüft das CDK lediglich, ob die aktuell verfügbaren AWS-Anmeldeinformationen dem Konto entsprechen und schlägt fehl, wenn dies nicht der Fall ist. Wenn Sie ein Anmeldeinformationsanbieter-Plugin (https://github.com/aws/aws-cdk/blob/master/packages/aws-cdk/lib/plugin.ts) bereitstellen, versucht es stattdessen, die korrekten Anmeldeinformationen von diesem Plugin zu erhalten. Diese Plugins sind derzeit eine undokumentierte experimentelle Funktion des CDK.

Die Idee ist einfach: Ein Plugin für den Anbieter von Anmeldeinformationen übersetzt eine 12-stellige AWS-Konto-ID in Anmeldeinformationen für dieses Konto. Es gibt eine sehr einfache Schnittstelle für die Quelle des Credential Providers (https://github.com/aws/aws-cdk/blob/master/packages/aws-cdk/lib/api/aws-auth/credentials.ts), die Sie implementieren müssen.

Beschaffung von Berechtigungsnachweisen

In unserer Beispielimplementierung des Credential Providers möchten wir eine einfache Möglichkeit haben, die eigentlichen Credentials zu erhalten. Wir haben dies in der SharedIniFileCredentials Klasse aus dem AWS SDK für JavaScript. Diese Klasse hat einige Eigenheiten und erfordert eine ungewöhnliche Datei. In dieser Datei geben wir sowohl statische Anmeldedaten für einen IAM-Benutzer als auch Profile für IAM-Rollen an, die der Benutzer übernehmen darf. Normalerweise würden Sie dies in eine ~/.aws/credentials Datei mit den Benutzeranmeldeinformationen und eine ~/.aws/config Datei mit den Profilen für die anderen Konten aufteilen.

Der Trick dabei ist, dass wir die Profile mit Konto-IDs benennen, damit wir nicht nach einem Profilnamen für eine ID suchen müssen.

# ~/.aws/credentials

[thomas]
aws_access_key_id = AKIAIIIIIIIIIIIIIIII
aws_secret_access_key = AcXXXXXXXXXXXXXXXXXXXXXXXXXDJ+0

[112233445566]
role_arn = arn:aws:iam::112233445566:role/thomas-no-mfa
source_profile = thomas

[223344556677]
role_arn = arn:aws:iam::223344556677:role/thomas-no-mfa
source_profile = thomas

Beispiel Credential Provider Quelle

Das CDK möchte Anmeldeinformationen für eine bestimmte AWS-Konto-ID abrufen. Wir implementieren eine Credential Provider-Quelle, die die SharedIniFileCredentials Klasse, um Anmeldeinformationen für Profile in Ihrer ~/.aws/credentials Datei mit der AWS-Konto-ID als Profilname zu erhalten. Wir besprechen die implementierten Methoden weiter unten.

// my-credential-provider-source.ts

import * as cdk from "aws-cdk";
import AWS = require("aws-sdk");

export class MyCredentialProviderSource implements cdk.CredentialProviderSource {
    name: string;

    constructor() {
        this.name = "MyCredentialProviderSource";
    }

    public async isAvailable(): Promise {
        return true;
    }

    public async canProvideCredentials(accountId: string): Promise {
        return true;
    }

    public async getProvider(accountId: string, mode: cdk.Mode): Promise {
        return new AWS.SharedIniFileCredentials({ profile: accountId });
    }
}

isAvailable

Mit der Methode isAvailable kann der Provider CDK mitteilen, ob er mit dem Laden fertig ist oder nicht.
Wir haben noch nicht untersucht, was passiert, wenn die Methode false zurückgibt.

canProvideCredentials

Die Methode canProvideCredentials sollte prüfen, ob der Anbieter Anmeldeinformationen für die angegebene accountId bereitstellen kann. Obwohl wir in dieser Beispielimplementierung nur true zurückgeben, sollte eine reale Implementierung die Datei ~/.aws/credentials analysieren und prüfen, ob ein Profil für das angegebene accountId existiert.

getProvider

Die Methode getProvider muss ein Credentials Objekt mit den Anmeldedaten für das Konto mit dem angegebenen accountId zurückgeben. Mit dem Argument mode kann das CDK angeben, ob Anmeldeinformationen mit Nur-Lese- oder Schreibrechten erforderlich sind. Wir haben das Argument mode in unserer Beispielimplementierung ignoriert.

Beispiel Plugin

Das Plugin selbst registriert lediglich die Quelle des Credential Providers bei der CDK.

// my-credential-provider-plugin.ts

import * as cdk from "aws-cdk";
import { MyCredentialProviderSource } from "./my-credential-provider-source";

export class MyCredentialProviderPlugin implements cdk.Plugin {
    public readonly version = "1";

    public init(host: cdk.PluginHost): void {
        host.registerCredentialProviderSource(new MyCredentialProviderSource());
    }
}

Verpackung des Plugins

Da das Credential Provider Source Plugin vom CDK über seinen Paketnamen angesprochen wird, müssen wir das Plugin verpacken.

Um zu verdeutlichen, dass das Modul eine Objektinstanz des Plugins bereitstellen muss, zeigen wir unten den Einstiegspunkt index.ts. Das vollständige Beispiel, einschließlich der letzten beiden wichtigen Dateien package.json (für mehr https://github.com/binxio/cdk-plugin-example/blob/master/my-credential-provider/package.json) und tsconfig.json, finden Sie in unserem Git-Repository.

Da der gesamte Code in TypeScript vorliegt, müssen wir das Projekt erstellen: npm run build

// index.ts

import { MyCredentialProviderPlugin } from "./my-credential-provider-plugin";

export = new MyCredentialProviderPlugin();

Verwendung des Plugins

Um das Plugin in Ihrem CDK-Projekt zu verwenden, müssen Sie es installieren. Ohne Ihr Plugin bei npm zu veröffentlichen, können Sie es von Ihrem lokalen Projekt aus installieren:

$ npm install --save-dev ../my-credential-provider

Jetzt können Sie das Plugin entweder als Befehlszeilenargument angeben oder es in der Datei cdk.json konfigurieren.

// cdk.json

{
    "app": "npx ts-node bin/demo.ts",
    "plugin": [
        "my-credential-provider"
    ]
}

Wenn Sie nun npx cdk diff oder npx cdk deploy ausführen, versucht das CDK, die Anmeldedaten vom Plugin zu erhalten!

Jetzt bauen Sie!

In den obigen Beispielen haben wir Ihnen gezeigt, wie Sie ein Credential Provider Plugin für das CDK implementieren können. Sie finden den Code für die Beispiele in unserem Git-Repository: github.com/binxio/cdk-plugin-example

Erstellen Sie jetzt Ihr eigenes geniales Plugin!

Verfasst von

Thomas de Ruiter

Cloud Consultant with a passion for everything Cloud. Likes to automate all the things. Believes security is everyone's responsibility!

Contact

Let’s discuss how we can support your journey.