Blog

Bereitstellung von Kong API-Gateway-Konfigurationen mit AWS CloudFormation

Mark van Holsteijn

Mark van Holsteijn

Aktualisiert Oktober 21, 2025
5 Minuten

Mit AWS CloudFormation ist es einfach, Ihre Anwendungen mit AWS Elastic Container Service bereitzustellen. Wenn Sie jedoch
den Zugriff auf Ihre Anwendungen über das Kong API Gateway bereitstellen möchten, bleibt Ihnen ein zusätzlicher Schritt im
Bereitstellungsprozess: die Konfiguration des Kong Gateways. Dies erschwert den Bereitstellungsprozess für ECS-Anwendungen.Mit den Custom CloudFormation Resources für das Kong API Gateway können wir sowohl die Anwendung
als auch die Kong API Gateway-Konfiguration in einem Schritt bereitstellen!Die Custom Resources ermöglichen Ihnen die Konfiguration von Kong APIs, Plugins, Consumern, ACL und Anmeldeinformationen. Mit den Ressourcen
können Sie auch ein JWT-Token angeben, das generiert und bei jeder Anfrage an Kong übergeben wird.

Wie kann ich eine Kong-API hinzufügen?

Es ist ganz einfach: Sie geben eine CloudFormation-Ressource vom Typ Custom::KongAPI an:

  "SampleApi": {
    "Type": "Custom::KongAPI",
    "Properties": {
      "API" : {
    "name": "headers",
    "uris": [ "/headers" ],
    "upstream_url": "https://httpbin.org",
    "strip_uri": false
      },
      "AdminURL": "https://kong:8001",
      "ServiceToken": { "Fn::Join": [ ":", [ "arn:aws:lambda", { "Ref": "AWS::Region" }, { "Ref": "AWS::AccountId" }, "function:binxio-cfn-kong-provider" ]]}
    }
  }

Das Objekt API übernimmt alle Eigenschaften, die in add-api definiert sind.
Wenn Sie in Ihrem Cloudformation-Modul auf die api-id zugreifen müssen, können Sie das Attribut id referenzieren.

{ "Fn::GetAtt": [ "SampleApi", "id" ]}

Wie kann ich ein Kong Plugin hinzufügen?

Sie geben eine CloudFormation-Ressource vom Typ Custom::KongPlugin an, wie folgt:

  "KeyAuthPlugin": {
    "Type": "Custom::KongPlugin",
    "Properties": {
      "Plugin" : {
    "name": "key-auth",
    "api_id": { "Fn::GetAtt": [ "SampleApi", "id" ] },
      },
      "AdminURL": "https://kong:8001",
      "ServiceToken": { "Fn::Join": [ ":", [ "arn:aws:lambda", { "Ref": "AWS::Region" }, { "Ref": "AWS::AccountId" }, "function:binxio-cfn-kong-provider" ]]}
    }
  }

Das Objekt Plugin übernimmt alle Eigenschaften, die durch add-plugin definiert sind.
Wenn Sie api_id weglassen, konfigurieren Sie ein globales Plugin. Wenn Sie ein hinzufügen, konfigurieren Sie
das Plugin für den angegebenen Verbraucher. Wenn Sie beides hinzufügen, gilt es für diesen Verbraucher auf dieser API. Wenn Sie auf die Plugin-ID in Ihrem Cloudformation-Modul zugreifen müssen, können Sie das Attribut id referenzieren.

{ "Fn::GetAtt": [ "KeyAuthPlugin", "id" ]}

Wie füge ich einen Kong-Verbraucher hinzu?

Sie geben eine CloudFormation-Ressource vom Typ Custom::KongConsumer an, wie folgt:

  "KongConsumer": {
    "Type": "Custom::KongConsumer",
    "Properties": {
      "Consumer" : {
    "username": "kong-admin",
      },
      "AdminURL": "https://kong:8001",
      "ServiceToken": { "Fn::Join": [ ":", [ "arn:aws:lambda", { "Ref": "AWS::Region" }, { "Ref": "AWS::AccountId" }, "function:binxio-cfn-kong-provider" ]]}
    }
  }

Das Objekt Consumer übernimmt alle Eigenschaften, die in add-consumer definiert sind.
Wenn Sie in Ihrem Cloudformation-Modul auf die consumer-id zugreifen müssen, können Sie auf das Attribut id verweisen.

{ "Fn::GetAtt": [ "KongConsumer", "id" ]}

Wie kann ich einen Verbraucher zu einer ACL-Gruppe hinzufügen?

Sie geben eine CloudFormation-Ressource vom Typ Custom::KongACL an, wie folgt:

  "KongACL": {
    "Type": "Custom::KongACL",
    "Properties": {
      "ACL" : {
    "group": "admin",
    "consumer_id": {"Fn::GetAtt": [ "KongConsumer", "id" ]}
      },
      "AdminURL": "https://kong:8001",
      "ServiceToken": { "Fn::Join": [ ":", [ "arn:aws:lambda", { "Ref": "AWS::Region" }, { "Ref": "AWS::AccountId" }, "function:binxio-cfn-kong-provider" ]]}
    }
  }

Das Objekt ACL enthält alle Eigenschaften, die vom ACL-Plugin in associating-consumers definiert wurden

Wie füge ich einem Verbraucher Berechtigungsnachweise hinzu?

Sie geben eine CloudFormation-Ressource vom Typ Custom::KongCredential an, wie folgt:

    "KongConsumerApiKey": {
      "Type": "Custom::KongCredential",
      "DependsOn": "KongConsumer",
      "Properties": {
        "PluginName": "key-auth",
        "Credential": {
          "consumer_id": { "Fn::GetAtt":  [ "KongConsumer", "id" ] },
          "key": "66471684-6BDF-4F11-868F-B513CC391520"
        },
      "AdminURL": "https://kong:8001",
      "ServiceToken": { "Fn::Join": [ ":", [ "arn:aws:lambda", { "Ref": "AWS::Region" }, { "Ref": "AWS::AccountId" }, "function:binxio-cfn-kong-provider" ]]}
    }
  }

Das Objekt Credential enthält alle Eigenschaften, die durch das Plugin definiert sind.

Wie authentifiziere ich die Kong-API-Anfragen?

Sie können das Objekt JWT zu jeder der benutzerdefinierten Ressourcen hinzufügen, indem Sie den Namen des Ausstellers und den Namen eines Parameters im Parameterspeicher angeben. Dieser Parameter sollte den privaten RSA-Schlüssel enthalten, mit dem das JWT-Token signiert werden soll. Das erzeugte Token wird an den authentication Header übergeben.

    "KongConsumerApiKey": {
      "Type": "Custom::Kong..."
      "Properties": {
    "JWT": {
       "Issuer": "admin",
        "PrivateKeyParameterName": "/kong/admin/private-key"
     }
         ....
    }
  }

Installation

Um diese benutzerdefinierten Ressourcen zu installieren, klonen Sie cfn-kong-provider aus git, und geben Sie ein:

cd cfn-kong-provider
aws cloudformation create-stack 
 --capabilities CAPABILITY_IAM 
 --stack-name cfn-kong-provider 
 --template-body file://cloudformation/cfn-resource-provider.json 

aws cloudformation wait stack-create-complete  --stack-name cfn-kong-provider 

Wenn Sie möchten, dass sich der Anbieter mit einem Kong-API-Gateway verbindet, das nur von einer VPC aus zugänglich ist, geben Sie die Parameter
AppVPC, PrivateSubnets und DefaultSecurityGroup an.

    --parameters 
        ParameterKey=AppVPC,ParameterValue=vpid-id 
        ParameterKey=PrivateSubnets,ParameterValue=subnet-id1,subnet-id2 
        ParameterKey=DefaultSecurityGroup,ParameterValue=sg-id

Diese CloudFormation-Vorlage verwendet unseren vorgefertigten Provider von s3://binxio-public-{{region}}/lambdas/cfn-kong-provider-latest.zip.

Demo

Damit die Demo funktioniert, benötigen wir ein eingesetztes Kong API Gateway, das über das Internet zugänglich ist. Wenn Sie das tun
keins haben, tippen Sie:

aws cloudformation create-stack --stack-name kong-environment 
 --template-body file://cloudformation/kong.json 
 --parameters ParameterKey=KongKeyName,ParameterValue=#insert-your-key-name-here#

aws cloudformation wait stack-create-complete  --stack-name kong-environment

ADMIN_URL=$(aws --output text --query 'Stacks[*].Outputs[?OutputKey==<code>AdminURL].OutputValue' 
     cloudformation describe-stacks --stack-name kong-environment)

Beachten Sie, dass damit eine komplette Kong-Einrichtung erstellt wird, einschließlich einer VPC, Lastverteilern und einer Postgres-Datenbank. Vergessen Sie nicht, anschließend
zu bereinigen.

aws cloudformation create-stack --stack-name cfn-kong-provider-demo 
 --template-body file://cloudformation/demo-stack.json 
 --parameters ParameterKey=AdminURL,ParameterValue=$ADMIN_URL

aws cloudformation wait stack-create-complete  --stack-name cfn-kong-provider-demo

Um das Ergebnis zu überprüfen, setzen Sie die Umgebungsvariable ADMIN_URL so, dass sie auf Ihren Kong-API-Admin-Port und -Typ zeigt:

curl $ADMIN_URL/apis/header-api
curl $ADMIN_URL/apis/header-api/plugins
curl $ADMIN_URL/consumers/johndoe
curl $ADMIN_URL/consumers/johndoe/acls
curl $ADMIN_URL/consumers/johndoe/basic-auth
curl $ADMIN_URL/consumers/johndoe/key-auth

Fazit

Mit den Kong Custom CloudFormation-Providern können Sie sowohl die Anwendung als auch die Kong API-Konfiguration für diese
Anwendung in einer einzigen CloudFormation-Vorlage bereitstellen und so den Bereitstellungsprozess vereinfachen. Wenn Sie Fragen haben, zögern Sie nicht, mich zu kontaktieren.

Verfasst von

Mark van Holsteijn

Mark van Holsteijn is a senior software systems architect at Xebia Cloud-native solutions. He is passionate about removing waste in the software delivery process and keeping things clear and simple.

Contact

Let’s discuss how we can support your journey.