

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

# IAM-Tutorial: Verwenden Sie eine CloudFormation Vorlage, um einen SAML Identity Provider (IdP) und eine SAML-Verbund-IAM-Rolle zu erstellen
<a name="tutorial_saml-idp-and-federated-role"></a>

Um sich mit dem SAML-Verbund und seinen Funktionen vertraut zu machen, verwenden Sie eine CloudFormation Vorlage, um einen SAML Identity Provider (IdP) und die zugehörige föderierte IAM-Rolle einzurichten. In diesem Tutorial erfahren Sie, wie Sie beide Ressourcen zusammen in einem einzigen Stack erstellen.

Die Vorlage erstellt einen SAML-IdP, der für den Verbundzugriff auf AWS Ressourcen verwendet werden kann, zusammen mit einer IAM-Rolle, die dem SAML-Anbieter vertraut. Benutzer, die von Ihrem externen IdP authentifiziert wurden, können diese Rolle für den Zugriff auf AWS Ressourcen übernehmen.

Die bereitgestellten Ressourcen enthalten Folgendes:
+ Einen SAML-IDP, der mit dem Metadatendokument Ihres IDP konfiguriert wurde.
+ Eine verbundene IAM-Rolle, die dem SAML-IDP vertraut und von authentifizierten Benutzern übernommen werden kann.
+ Konfigurierbare verwaltete Richtlinien, die der Rolle zugeordnet werden können, um bestimmte Berechtigungen zu gewähren.

## Voraussetzungen
<a name="tutorial_saml-idp-and-federated-role-prereqs"></a>

In diesem Tutorial wird davon ausgegangen, dass Folgendes bereits vorhanden ist:
+ Python 3.6 oder höher ist auf Ihrem lokalen Computer installiert, um den Python-Befehl auszuführen, der in diesem Tutorial zum Formatieren der XML-Datei für die SAML-Metadaten Ihres IDP verwendet wird.
+ Ein SAML-Metadatendokument von Ihrem externen IDP, das als XML-Datei gespeichert wurde.

## Erstellen Sie einen SAML-IdP und eine Rolle mit CloudFormation
<a name="tutorial_saml-idp-and-federated-role-create"></a>

Um den SAML-IdP und die Verbundrolle zu erstellen, erstellen Sie eine CloudFormation Vorlage und verwenden sie, um einen Stack zu erstellen, der beide Ressourcen enthält.

### Erstellen der -Vorlage
<a name="tutorial_saml-idp-and-federated-role-file"></a>

Erstellen Sie zunächst die Vorlage. CloudFormation 

1. Klicken Sie im Abschnitt „[Vorlage](#tutorial_saml-idp-and-federated-role-template)“ auf das Kopiersymbol auf der Registerkarte **JSON** oder **YAML**, um den Inhalt der Vorlage zu kopieren.

1. Fügen Sie den Inhalt der Vorlage in eine neue Datei ein.

1. Speichern Sie die Datei lokal.

### Erstellen Sie den -Stack
<a name="tutorial_saml-idp-and-federated-role-stack"></a>

Verwenden Sie als Nächstes die Vorlage, die Sie gespeichert haben, um einen CloudFormation Stack bereitzustellen.

1. Öffnen Sie die CloudFormation Konsole unter [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. Auf der Seite **Stacks** wählen Sie im Menü **Stack erstellen** die Option **Mit neuen Ressourcen (Standard)** aus.

1. Legen Sie die Vorlage fest:

   1. Wählen Sie unter **Voraussetzung** die Option **Vorhandene Vorlage wählen** aus.

   1. Wählen Sie unter **Vorlage angeben** die Option **Eine Vorlagendatei hochladen** aus.

   1. Klicken Sie auf **Datei auswählen**, navigieren Sie zur gewünschten Vorlagendatei und wählen Sie diese aus.

   1. Wählen Sie **Weiter** aus.

1. Geben Sie die folgenden Stack-Details an:

   1. Geben Sie einen Stack-Namen ein.

   1. Denn Sie können dieses Feld leer lassen **IdentityProviderName**, um automatisch einen Namen basierend auf dem Stacknamen zu generieren, oder einen benutzerdefinierten Namen für Ihren SAML-IdP eingeben.

      Beispiel: `CompanyIdP` oder `EnterpriseSSO`

   1. Für **IdentityProviderSAMLMetadataDocument** müssen Sie Ihre SAML-Metadaten-XML-Datei als eine einzelne Zeile formatieren, bevor Sie sie in dieses Feld einfügen. Dies ist erforderlich, da die CloudFormation Konsole erfordert, dass XML-Inhalt als eine einzelne Zeile formatiert wird, wenn er über Konsolenparameter übergeben wird.

      Formatieren Sie Ihre XML-Datei mit dem folgenden Python-Befehl neu:

      ```
      python3 -c "import sys, re; content=open(sys.argv[1]).read(); print(re.sub(r'>\s+<', '><', content.replace('\n', '').replace('\r', '').strip()))" saml-metadata.xml
      ```
**Anmerkung**  
Das SAML-Metadatendokument des IDP muss für die Eingabe von Konsolenparametern als einzelne Zeile formatiert werden. Der Python-Befehl entfernt Zeilenumbrüche und überflüssige Leerzeichen, um das erforderliche Format zu erstellen und gleichzeitig den ursprünglichen Inhalt und die ursprüngliche Struktur beizubehalten.

      Kopieren Sie die Ausgabe des Python-Befehls und fügen Sie sie in das Feld **IdentityProviderSAMLMetadataDokument** ein.

      Beispiel eines formatierten SAML-Metadatendokuments (gekürzt):

      ```
      <?xml version="1.0" encoding="UTF-8"?><md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" entityID="https://portal.sso.example.com/saml/assertion/CompanyIdP"><md:IDPSSODescriptor WantAuthnRequestsSigned="false" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol"><md:KeyDescriptor use="signing"><ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"><ds:X509Data><ds:X509Certificate>MIIDXTCCAkWgAwIBAgIJAJC1HiIAZAiIMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV...</ds:X509Certificate></ds:X509Data></ds:KeyInfo></md:KeyDescriptor><md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://portal.sso.example.com/saml/logout/CompanyIdP"/><md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent</md:NameIDFormat><md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://portal.sso.example.com/saml/assertion/CompanyIdP"/></md:IDPSSODescriptor></md:EntityDescriptor>
      ```

   1. Denn Sie können dieses Feld leer lassen **RoleName**, um automatisch einen Namen basierend auf dem Stacknamen zu generieren, oder einen benutzerdefinierten Namen für die föderierte IAM-Rolle eingeben.

      Beispiel: `SAML-Developer-Access` oder `SAML-ReadOnly-Role`

   1. Akzeptieren Sie für andere Parameter die Standardwerte oder geben Sie je nach Ihren Anforderungen Ihre eigenen ein:
      + **IdentityProviderAddPrivateKey**— Optionaler privater Schlüssel zum Entschlüsseln von SAML-Assertionen
      + **IdentityProviderAssertionEncryptionMode**- Verschlüsselungsmodus für SAML-Assertionen

        Beispielwerte: `Allowed`, `Required` oder leer lassen für keine Verschlüsselung
      + **RoleSessionDuration**- Maximale Sitzungsdauer in Sekunden (3600-43200, Standard 7200)

        Beispiel: `14400` (4 Stunden)
      + **RolePermissionsBoundary**- Optionaler ARN einer Berechtigungsgrenzrichtlinie

        Beispiel: `arn:aws:iam::123456789012:policy/DeveloperBoundary`
      + **RolePath**— Pfad für die IAM-Rolle (Standard ist/)

        Beispiel: `/saml-roles/`
      + **RoleManagedPolicy1-5** — Optional können bis ARNs zu 5 verwaltete Richtlinien angehängt werden

        Beispiel für RoleManagedPolicy 1: `arn:aws:iam::aws:policy/ReadOnlyAccess`

        Beispiel für RoleManagedPolicy 2: `arn:aws:iam::123456789012:policy/CustomPolicy`

   1. Wählen Sie **Weiter** aus.

1. Konfigurieren Sie die Stack-Optionen:

   1. Wählen Sie unter **Optionen für Stack-Fehler** die Option **Löschen aller neu erstellten Ressourcen** aus.
**Anmerkung**  
Durch Auswahl dieser Option vermeiden Sie möglicherweise anfallende Kosten für Ressourcen, deren Löschrichtlinie deren Beibehaltung auch bei einem Fehler bei der Stack-Erstellung vorsieht.

   1. Akzeptieren Sie alle anderen Standardwerte.

   1. Markieren Sie unter **Funktionen** das Kästchen, um zu bestätigen, dass CloudFormation dadurch IAM-Ressourcen in Ihrem Konto erstellt werden könnten.

   1. Wählen Sie **Weiter** aus.

1. Überprüfen Sie die Stack-Details und klicken Sie auf **Absenden**.

CloudFormation erstellt den Stack. Sobald die Stack-Erstellung abgeschlossen ist, können die Stack-Ressourcen verwendet werden. Auf der Registerkarte **Ressourcen** der Stack-Detailseite können Sie die in Ihrem Konto bereitgestellten Ressourcen anzeigen.

Der Stack gibt die folgenden Werte aus, die Sie auf der Registerkarte **Ausgaben** einsehen können:
+ **RoleARN**: Der ARN der erstellten IAM-Rolle (z. B. `arn:aws:iam::123456789012:role/SAML-Developer-Access` oder `arn:aws:iam::123456789012:role/stack-name-a1b2c3d4` bei Verwendung eines automatisch generierten Namens).
+ **IdentityProviderARN**: Der ARN des erstellten SAML-IdP (zum Beispiel`arn:aws:iam::123456789012:saml-provider/CompanyIdP`).

Sie benötigen beide, ARNs wenn Sie Ihren IdP so konfigurieren, dass er die entsprechenden SAML-Attribute für die Rollenübernahme sendet.

## Testen des SAML-Verbunds
<a name="tutorial_saml-idp-and-federated-role-using"></a>

Nachdem der SAML-IDP und die Verbundrolle erstellt wurden, können Sie die Verbundeinrichtung testen.

1. Öffnen Sie unter [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) die IAM-Konsole.

1. Wählen Sie im Navigationsbereich **Identitätsanbieter**.

   Ihr neu erstellter SAML-IDP sollte in der Liste angezeigt werden.

1. Wählen Sie den IDP-Namen aus, um die Details anzuzeigen.

   Auf der IDP-Detailseite sehen Sie das SAML-Metadatendokument und weitere Konfigurationsdetails.

1. Wählen Sie im Navigationsbereich **Rollen**.

1. Suchen Sie Ihre neu erstellte verbundene Rolle und wählen Sie sie aus.

   Auf der Rollendetailseite sehen Sie die Vertrauensrichtlinie, die es dem SAML-IDP ermöglicht, diese Rolle zu übernehmen.

1. Wählen Sie die Registerkarte **Vertrauensstellungen**, um die Vertrauensrichtlinie zu überprüfen.

   Die Vertrauensrichtlinie sollte anzeigen, dass der SAML-IDP berechtigt ist, diese Rolle zu übernehmen, sofern die SAML-Zielgruppe (`SAML:aud`) mit `https://signin.aws.amazon.com/saml` übereinstimmt.

## Bereinigung: Ressourcen löschen
<a name="tutorial_saml-idp-and-federated-role-delete"></a>

Im letzten Schritt löschen Sie den Stack und die darin enthaltenen Ressourcen.

1. Öffnen Sie die Konsole CloudFormation .

1. Wählen Sie auf der Seite **Stacks** den aus der Vorlage erstellten Stack aus und klicken Sie auf **Löschen**. Bestätigen Sie dann **Löschen**.

   CloudFormation initiiert das Löschen des Stacks und aller darin enthaltenen Ressourcen.

## CloudFormation Details zur Vorlage
<a name="tutorial_saml-idp-and-federated-role-template-details"></a>

### Ressourcen
<a name="tutorial_saml-idp-and-federated-role-template-resources"></a>

Mit der CloudFormation Vorlage für dieses Tutorial werden die folgenden Ressourcen in Ihrem Konto erstellt:
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-samlprovider.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-samlprovider.html): Ein SAML-IdP, der Vertrauen zwischen AWS und Ihrem externen IdP herstellt.
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html): Eine verbundene IAM-Rolle, die von Benutzern übernommen werden kann, die sich über den SAML-IDP authentifiziert haben.

### Konfiguration
<a name="tutorial_saml-idp-and-federated-role-configuration"></a>

Die Vorlage enthält die folgenden konfigurierbaren Parameter:
+ **IdentityProviderName**- Name des SAML-IdP (leer lassen für den automatisch generierten Namen)
+ **IdentityProviderSAMLMetadataDokument** — SAML-Metadatendokument von Ihrem IdP (erforderlich)
+ **IdentityProviderAddPrivateKey**- Optionaler privater Schlüssel zum Entschlüsseln von SAML-Assertionen
+ **IdentityProviderAssertionEncryptionMode**- Verschlüsselungsmodus für SAML-Assertionen
+ **RoleName**- Name der IAM-Rolle (leer lassen für den automatisch generierten Namen)
+ **RolePath**— Pfad für die IAM-Rolle (Standard/)
+ **RolePermissionsBoundary**- Optionaler ARN der Grenzrichtlinie für Berechtigungen
+ **RoleSessionDuration**- Maximale Sitzungsdauer in Sekunden (3600-43200, Standard 7200)
+ **RoleManagedPolicy1-5** — Optional können bis zu 5 ARNs verwaltete Richtlinien angehängt werden

## CloudFormation Vorlage
<a name="tutorial_saml-idp-and-federated-role-template"></a>

Speichern Sie den folgenden JSON- oder YAML-Code als separate Datei, um ihn als CloudFormation Vorlage für dieses Tutorial zu verwenden.

------
#### [ JSON ]

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "[AWSDocs] IAM: tutorial_saml-idp-and-federated-role",
  "Parameters": {
    "IdentityProviderName": {
      "Type": "String",
      "Description": "Name of the SAML Identity Provider (leave empty for auto-generated name like '{StackName}-{UniqueId}')",
      "Default": "",
      "AllowedPattern": "^$|^[a-zA-Z0-9._-]+$",
      "ConstraintDescription": "Must be empty or contain only alphanumeric characters, periods, underscores, and hyphens"
    },
    "IdentityProviderSAMLMetadataDocument": {
      "Type": "String",
      "Description": "SAML metadata document from identity provider"
    },
    "IdentityProviderAddPrivateKey": {
      "Type": "String",
      "Description": "Optional private key for decrypting SAML assertions. The private key must be a .pem file that uses AES-GCM or AES-CBC encryption algorithm to decrypt SAML assertions.",
      "Default": ""
    },
    "IdentityProviderAssertionEncryptionMode": {
      "Type": "String",
      "Description": "Optional, sets encryption mode for SAML assertions",
      "Default": "",
      "AllowedValues": ["", "Allowed", "Required"]
    },
    "RoleName": {
      "Type": "String",
      "Description": "Name of the IAM Role (leave empty for auto-generated name like '{StackName}-{UniqueId}')",
      "Default": "",
      "AllowedPattern": "^$|^[\\w+=,.@-]{1,64}$",
      "ConstraintDescription": "Must be empty or 1-64 characters and can contain alphanumeric characters and +=,.@-"
    },
    "RolePath": {
      "Type": "String",
      "Description": "Path for the IAM Role",
      "AllowedPattern": "(^\\/$)|(^\\/.*\\/$)",
      "Default": "/"
    },
    "RolePermissionsBoundary": {
      "Type": "String",
      "Description": "Optional ARN of the permissions boundary policy (leave empty for none)",
      "Default": ""
    },
    "RoleSessionDuration": {
      "Description": "The maximum session duration (in seconds) that you want to set for the specified role (3600-43200)",
      "Type": "Number",
      "MinValue": 3600,
      "MaxValue": 43200,
      "Default": 7200
    },
    "RoleManagedPolicy1": {
      "Type": "String",
      "Description": "Optional managed policy ARN 1",
      "Default": ""
    },
    "RoleManagedPolicy2": {
      "Type": "String",
      "Description": "Optional managed policy ARN 2",
      "Default": ""
    },
    "RoleManagedPolicy3": {
      "Type": "String",
      "Description": "Optional managed policy ARN 3",
      "Default": ""
    },
    "RoleManagedPolicy4": {
      "Type": "String",
      "Description": "Optional managed policy ARN 4",
      "Default": ""
    },
    "RoleManagedPolicy5": {
      "Type": "String",
      "Description": "Optional managed policy ARN 5",
      "Default": ""
    }
  },
  "Conditions": {
    "HasCustomProviderName": {"Fn::Not": [{"Fn::Equals": [{"Ref": "IdentityProviderName"}, ""]}]},
    "HasCustomRoleName": {"Fn::Not": [{"Fn::Equals": [{"Ref": "RoleName"}, ""]}]},
    "HasPermissionsBoundary": {"Fn::Not": [{"Fn::Equals": [{"Ref": "RolePermissionsBoundary"}, ""]}]},
    "HasPolicy1": {"Fn::Not": [{"Fn::Equals": [{"Ref": "RoleManagedPolicy1"}, ""]}]},
    "HasPolicy2": {"Fn::Not": [{"Fn::Equals": [{"Ref": "RoleManagedPolicy2"}, ""]}]},
    "HasPolicy3": {"Fn::Not": [{"Fn::Equals": [{"Ref": "RoleManagedPolicy3"}, ""]}]},
    "HasPolicy4": {"Fn::Not": [{"Fn::Equals": [{"Ref": "RoleManagedPolicy4"}, ""]}]},
    "HasPolicy5": {"Fn::Not": [{"Fn::Equals": [{"Ref": "RoleManagedPolicy5"}, ""]}]},
    "HasPrivateKey": {"Fn::Not": [{"Fn::Equals": [{"Ref": "IdentityProviderAddPrivateKey"}, ""]}]},
    "HasAssertionEncryptionMode": {"Fn::Not": [{"Fn::Equals": [{"Ref": "IdentityProviderAssertionEncryptionMode"}, ""]}]}
  },
  "Resources": {
    "SAMLProvider": {
      "Type": "AWS::IAM::SAMLProvider",
      "Properties": {
        "Name": {"Fn::If": ["HasCustomProviderName", {"Ref": "IdentityProviderName"}, {"Ref": "AWS::NoValue"}]},
        "SamlMetadataDocument": {"Ref": "IdentityProviderSAMLMetadataDocument"},
        "AddPrivateKey": {"Fn::If": ["HasPrivateKey", {"Ref": "IdentityProviderAddPrivateKey"}, {"Ref": "AWS::NoValue"}]},
        "AssertionEncryptionMode": {"Fn::If": ["HasAssertionEncryptionMode", {"Ref": "IdentityProviderAssertionEncryptionMode"}, {"Ref": "AWS::NoValue"}]}
      }
    },
    "SAMLFederatedRole": {
      "Type": "AWS::IAM::Role",
      "Properties": {
        "RoleName": {"Fn::If": ["HasCustomRoleName", {"Ref": "RoleName"}, {"Ref": "AWS::NoValue"}]},
        "Path": {"Ref": "RolePath"},
        "Description": "SAML federated IAM role for SSO access with specified permissions",
        "MaxSessionDuration": {"Ref": "RoleSessionDuration"},
        "PermissionsBoundary": {"Fn::If": ["HasPermissionsBoundary", {"Ref": "RolePermissionsBoundary"}, {"Ref": "AWS::NoValue"}]},
        "AssumeRolePolicyDocument": {
          "Version": "2012-10-17",		 	 	 
          "Statement": [
            {
              "Effect": "Allow",
              "Principal": {
                "Federated": {"Ref": "SAMLProvider"}
              },
              "Action": [
                "sts:AssumeRole",
                "sts:SetSourceIdentity",
                "sts:TagSession"
              ],
              "Condition": {
                "StringEquals": {
                  "SAML:aud": "https://signin.aws.amazon.com/saml"
                }
              }
            }
          ]
        },
        "ManagedPolicyArns": {
          "Fn::Split": [
            ",",
            {
              "Fn::Join": [
                ",",
                [
                  {"Fn::If": ["HasPolicy1", {"Ref": "RoleManagedPolicy1"}, {"Ref": "AWS::NoValue"}]},
                  {"Fn::If": ["HasPolicy2", {"Ref": "RoleManagedPolicy2"}, {"Ref": "AWS::NoValue"}]},
                  {"Fn::If": ["HasPolicy3", {"Ref": "RoleManagedPolicy3"}, {"Ref": "AWS::NoValue"}]},
                  {"Fn::If": ["HasPolicy4", {"Ref": "RoleManagedPolicy4"}, {"Ref": "AWS::NoValue"}]},
                  {"Fn::If": ["HasPolicy5", {"Ref": "RoleManagedPolicy5"}, {"Ref": "AWS::NoValue"}]}
                ]
              ]
            }
          ]
        }
      }
    }
  },
  "Outputs": {
    "RoleARN": {
      "Description": "ARN of the created IAM Role",
      "Value": {"Fn::GetAtt": ["SAMLFederatedRole", "Arn"]},
      "Export": {
        "Name": {"Fn::Sub": "${AWS::StackName}-RoleARN"}
      }
    },
    "IdentityProviderARN": {
      "Description": "ARN of the created SAML Identity Provider",
      "Value": {"Ref": "SAMLProvider"},
      "Export": {
        "Name": {"Fn::Sub": "${AWS::StackName}-IdentityProviderARN"}
      }
    }
  }
}
```

------
#### [ YAML ]

```
AWSTemplateFormatVersion: '2010-09-09'
Description: '[AWSDocs] IAM: tutorial_saml-idp-and-federated-role'

Parameters:
  IdentityProviderName:
    Type: String
    Description: Name of the SAML Identity Provider (leave empty for auto-generated name like '{StackName}-{UniqueId}')
    Default: ""
    AllowedPattern: '^$|^[a-zA-Z0-9._-]+$'
    ConstraintDescription: Must be empty or contain only alphanumeric characters, periods, underscores, and hyphens

  IdentityProviderSAMLMetadataDocument:
    Type: String
    Description: SAML metadata document from identity provider

  IdentityProviderAddPrivateKey:
    Type: String
    Description: Optional private key for decrypting SAML assertions. The private key must be a .pem file that uses AES-GCM or AES-CBC encryption algorithm to decrypt SAML assertions.
    Default: ""

  IdentityProviderAssertionEncryptionMode:
    Type: String
    Description: Optional, sets encryption mode for SAML assertions
    Default: ""
    AllowedValues:
      - ""
      - "Allowed"
      - "Required"

  RoleName:
    Type: String
    Description: Name of the IAM Role (leave empty for auto-generated name like '{StackName}-{UniqueId}')
    Default: ""
    AllowedPattern: '^$|^[\w+=,.@-]{1,64}$'
    ConstraintDescription: "Must be empty or 1-64 characters and can contain alphanumeric characters and +=,.@-"

  RolePath:
    Type: String
    Description: Path for the IAM Role
    AllowedPattern: (^\/$)|(^\/.*\/$)
    Default: "/"

  RolePermissionsBoundary:
    Type: String
    Description: Optional ARN of the permissions boundary policy (leave empty for none)
    Default: ""
    
  RoleSessionDuration:
    Description: The maximum session duration (in seconds) that you want to set for the specified role (3600-43200)
    Type: Number
    MinValue: 3600
    MaxValue: 43200
    Default: 7200

  RoleManagedPolicy1:
    Type: String
    Description: Optional managed policy ARN 1
    Default: ""
  RoleManagedPolicy2:
    Type: String
    Description: Optional managed policy ARN 2
    Default: ""
  RoleManagedPolicy3:
    Type: String
    Description: Optional managed policy ARN 3
    Default: ""
  RoleManagedPolicy4:
    Type: String
    Description: Optional managed policy ARN 4
    Default: ""
  RoleManagedPolicy5:
    Type: String
    Description: Optional managed policy ARN 5
    Default: ""

Conditions:
  HasCustomProviderName: !Not [!Equals [!Ref IdentityProviderName, ""]]
  HasCustomRoleName: !Not [!Equals [!Ref RoleName, ""]]
  HasPermissionsBoundary: !Not [!Equals [!Ref RolePermissionsBoundary, ""]]
  HasPolicy1: !Not [!Equals [!Ref RoleManagedPolicy1, ""]]
  HasPolicy2: !Not [!Equals [!Ref RoleManagedPolicy2, ""]]
  HasPolicy3: !Not [!Equals [!Ref RoleManagedPolicy3, ""]]
  HasPolicy4: !Not [!Equals [!Ref RoleManagedPolicy4, ""]]
  HasPolicy5: !Not [!Equals [!Ref RoleManagedPolicy5, ""]]
  HasPrivateKey: !Not [!Equals [!Ref IdentityProviderAddPrivateKey, ""]]
  HasAssertionEncryptionMode: !Not [!Equals [!Ref IdentityProviderAssertionEncryptionMode, ""]]

Resources:
  SAMLProvider:
    Type: AWS::IAM::SAMLProvider
    Properties:
      Name: !If
        - HasCustomProviderName
        - !Ref IdentityProviderName
        - !Ref AWS::NoValue
      SamlMetadataDocument: !Ref IdentityProviderSAMLMetadataDocument
      AddPrivateKey: !If
        - HasPrivateKey
        - !Ref IdentityProviderAddPrivateKey
        - !Ref AWS::NoValue
      AssertionEncryptionMode: !If
        - HasAssertionEncryptionMode
        - !Ref IdentityProviderAssertionEncryptionMode
        - !Ref AWS::NoValue

  SAMLFederatedRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !If
        - HasCustomRoleName
        - !Ref RoleName
        - !Ref AWS::NoValue
      Path: !Ref RolePath
      Description: "SAML federated IAM role for SSO access with specified permissions"
      MaxSessionDuration: !Ref RoleSessionDuration
      PermissionsBoundary: !If
        - HasPermissionsBoundary
        - !Ref RolePermissionsBoundary
        - !Ref AWS::NoValue
      AssumeRolePolicyDocument:
        Version: '2012-10-17		 	 	 '
        Statement:
          - Effect: Allow
            Principal:
              Federated: !Ref SAMLProvider
            Action:
              - 'sts:AssumeRole'
              - 'sts:SetSourceIdentity'
              - 'sts:TagSession'
            Condition:
              StringEquals:
                'SAML:aud': 'https://signin.aws.amazon.com/saml'
      ManagedPolicyArns: !Split
        - ','
        - !Join
          - ','
          - - !If [HasPolicy1, !Ref RoleManagedPolicy1, !Ref "AWS::NoValue"]
            - !If [HasPolicy2, !Ref RoleManagedPolicy2, !Ref "AWS::NoValue"]
            - !If [HasPolicy3, !Ref RoleManagedPolicy3, !Ref "AWS::NoValue"]
            - !If [HasPolicy4, !Ref RoleManagedPolicy4, !Ref "AWS::NoValue"]
            - !If [HasPolicy5, !Ref RoleManagedPolicy5, !Ref "AWS::NoValue"]

Outputs:
  RoleARN:
    Description: ARN of the created IAM Role
    Value: !GetAtt SAMLFederatedRole.Arn
    Export:
      Name: !Sub '${AWS::StackName}-RoleARN'

  IdentityProviderARN:
    Description: ARN of the created SAML Identity Provider
    Value: !Ref SAMLProvider
    Export:
      Name: !Sub '${AWS::StackName}-IdentityProviderARN'
```

------