aws-cdk-aws-iam 1.204.0


pip install aws-cdk-aws-iam

  Latest version

Released: Jun 19, 2023

Project Links

Meta
Author: Amazon Web Services
Requires Python: ~=3.7

Classifiers

Intended Audience
  • Developers

Operating System
  • OS Independent

Programming Language
  • JavaScript
  • Python :: 3 :: Only
  • Python :: 3.7
  • Python :: 3.8
  • Python :: 3.9
  • Python :: 3.10
  • Python :: 3.11

Typing
  • Typed

Development Status
  • 7 - Inactive

License
  • OSI Approved

Framework
  • AWS CDK
  • AWS CDK :: 1

AWS Identity and Access Management Construct Library

---

End-of-Support

AWS CDK v1 has reached End-of-Support on 2023-06-01. This package is no longer being updated, and users should migrate to AWS CDK v2.

For more information on how to migrate, see the Migrating to AWS CDK v2 guide.


Define a role and add permissions to it. This will automatically create and attach an IAM policy to the role:

role = Role(self, "MyRole",
    assumed_by=ServicePrincipal("sns.amazonaws.com")
)

role.add_to_policy(PolicyStatement(
    resources=["*"],
    actions=["lambda:InvokeFunction"]
))

Define a policy and attach it to groups, users and roles. Note that it is possible to attach the policy either by calling xxx.attachInlinePolicy(policy) or policy.attachToXxx(xxx).

user = User(self, "MyUser", password=cdk.SecretValue.unsafe_plain_text("1234"))
group = Group(self, "MyGroup")

policy = Policy(self, "MyPolicy")
policy.attach_to_user(user)
group.attach_inline_policy(policy)

Managed policies can be attached using xxx.addManagedPolicy(ManagedPolicy.fromAwsManagedPolicyName(policyName)):

group = Group(self, "MyGroup")
group.add_managed_policy(ManagedPolicy.from_aws_managed_policy_name("AdministratorAccess"))

Granting permissions to resources

Many of the AWS CDK resources have grant* methods that allow you to grant other resources access to that resource. As an example, the following code gives a Lambda function write permissions (Put, Update, Delete) to a DynamoDB table.

# fn: lambda.Function
# table: dynamodb.Table


table.grant_write_data(fn)

The more generic grant method allows you to give specific permissions to a resource:

# fn: lambda.Function
# table: dynamodb.Table


table.grant(fn, "dynamodb:PutItem")

The grant* methods accept an IGrantable object. This interface is implemented by IAM principlal resources (groups, users and roles) and resources that assume a role such as a Lambda function, EC2 instance or a Codebuild project.

You can find which grant* methods exist for a resource in the AWS CDK API Reference.

Roles

Many AWS resources require Roles to operate. These Roles define the AWS API calls an instance or other AWS service is allowed to make.

Creating Roles and populating them with the right permissions Statements is a necessary but tedious part of setting up AWS infrastructure. In order to help you focus on your business logic, CDK will take care of creating roles and populating them with least-privilege permissions automatically.

All constructs that require Roles will create one for you if don't specify one at construction time. Permissions will be added to that role automatically if you associate the construct with other constructs from the AWS Construct Library (for example, if you tell an AWS CodePipeline to trigger an AWS Lambda Function, the Pipeline's Role will automatically get lambda:InvokeFunction permissions on that particular Lambda Function), or if you explicitly grant permissions using grant functions (see the previous section).

Opting out of automatic permissions management

You may prefer to manage a Role's permissions yourself instead of having the CDK automatically manage them for you. This may happen in one of the following cases:

  • You don't like the permissions that CDK automatically generates and want to substitute your own set.
  • The least-permissions policy that the CDK generates is becoming too big for IAM to store, and you need to add some wildcards to keep the policy size down.

To prevent constructs from updating your Role's policy, pass the object returned by myRole.withoutPolicyUpdates() instead of myRole itself.

For example, to have an AWS CodePipeline not automatically add the required permissions to trigger the expected targets, do the following:

role = iam.Role(self, "Role",
    assumed_by=iam.ServicePrincipal("codepipeline.amazonaws.com"),
    # custom description if desired
    description="This is a custom role..."
)

codepipeline.Pipeline(self, "Pipeline",
    # Give the Pipeline an immutable view of the Role
    role=role.without_policy_updates()
)

# You now have to manage the Role policies yourself
role.add_to_policy(iam.PolicyStatement(
    actions=[],
    resources=[]
))

Using existing roles

If there are Roles in your account that have already been created which you would like to use in your CDK application, you can use Role.fromRoleArn to import them, as follows:

role = iam.Role.from_role_arn(self, "Role", "arn:aws:iam::123456789012:role/MyExistingRole",
    # Set 'mutable' to 'false' to use the role as-is and prevent adding new
    # policies to it. The default is 'true', which means the role may be
    # modified as part of the deployment.
    mutable=False
)

Configuring an ExternalId

If you need to create Roles that will be assumed by third parties, it is generally a good idea to require an ExternalId to assume them. Configuring an ExternalId works like this:

role = iam.Role(self, "MyRole",
    assumed_by=iam.AccountPrincipal("123456789012"),
    external_ids=["SUPPLY-ME"]
)

Principals vs Identities

When we say Principal, we mean an entity you grant permissions to. This entity can be an AWS Service, a Role, or something more abstract such as "all users in this account" or even "all users in this organization". An Identity is an IAM representing a single IAM entity that can have a policy attached, one of Role, User, or Group.

IAM Principals

When defining policy statements as part of an AssumeRole policy or as part of a resource policy, statements would usually refer to a specific IAM principal under Principal.

IAM principals are modeled as classes that derive from the iam.PolicyPrincipal abstract class. Principal objects include principal type (string) and value (array of string), optional set of conditions and the action that this principal requires when it is used in an assume role policy document.

To add a principal to a policy statement you can either use the abstract statement.addPrincipal, one of the concrete addXxxPrincipal methods:

  • addAwsPrincipal, addArnPrincipal or new ArnPrincipal(arn) for { "AWS": arn }
  • addAwsAccountPrincipal or new AccountPrincipal(accountId) for { "AWS": account-arn }
  • addServicePrincipal or new ServicePrincipal(service) for { "Service": service }
  • addAccountRootPrincipal or new AccountRootPrincipal() for { "AWS": { "Ref: "AWS::AccountId" } }
  • addCanonicalUserPrincipal or new CanonicalUserPrincipal(id) for { "CanonicalUser": id }
  • addFederatedPrincipal or new FederatedPrincipal(federated, conditions, assumeAction) for { "Federated": arn } and a set of optional conditions and the assume role action to use.
  • addAnyPrincipal or new AnyPrincipal for { "AWS": "*" }

If multiple principals are added to the policy statement, they will be merged together:

statement = iam.PolicyStatement()
statement.add_service_principal("cloudwatch.amazonaws.com")
statement.add_service_principal("ec2.amazonaws.com")
statement.add_arn_principal("arn:aws:boom:boom")

Will result in:

{
  "Principal": {
    "Service": [ "cloudwatch.amazonaws.com", "ec2.amazonaws.com" ],
    "AWS": "arn:aws:boom:boom"
  }
}

The CompositePrincipal class can also be used to define complex principals, for example:

role = iam.Role(self, "MyRole",
    assumed_by=iam.CompositePrincipal(
        iam.ServicePrincipal("ec2.amazonaws.com"),
        iam.AccountPrincipal("1818188181818187272"))
)

The PrincipalWithConditions class can be used to add conditions to a principal, especially those that don't take a conditions parameter in their constructor. The principal.withConditions() method can be used to create a PrincipalWithConditions from an existing principal, for example:

principal = iam.AccountPrincipal("123456789000").with_conditions({"StringEquals": {"foo": "baz"}})

NOTE: If you need to define an IAM condition that uses a token (such as a deploy-time attribute of another resource) in a JSON map key, use CfnJson to render this condition. See this test for an example.

The WebIdentityPrincipal class can be used as a principal for web identities like Cognito, Amazon, Google or Facebook, for example:

principal = iam.WebIdentityPrincipal("cognito-identity.amazonaws.com", {
    "StringEquals": {"cognito-identity.amazonaws.com:aud": "us-east-2:12345678-abcd-abcd-abcd-123456"},
    "ForAnyValue:StringLike": {"cognito-identity.amazonaws.com:amr": "unauthenticated"}
})

If your identity provider is configured to assume a Role with session tags, you need to call .withSessionTags() to add the required permissions to the Role's policy document:

iam.Role(self, "Role",
    assumed_by=iam.WebIdentityPrincipal("cognito-identity.amazonaws.com", {
        "StringEquals": {
            "cognito-identity.amazonaws.com:aud": "us-east-2:12345678-abcd-abcd-abcd-123456"
        },
        "ForAnyValue:StringLike": {
            "cognito-identity.amazonaws.com:amr": "unauthenticated"
        }
    }).with_session_tags()
)

Parsing JSON Policy Documents

The PolicyDocument.fromJson and PolicyStatement.fromJson static methods can be used to parse JSON objects. For example:

policy_document = {
    "Version": "2012-10-17",
    "Statement": [{
        "Sid": "FirstStatement",
        "Effect": "Allow",
        "Action": ["iam:ChangePassword"],
        "Resource": "*"
    }, {
        "Sid": "SecondStatement",
        "Effect": "Allow",
        "Action": "s3:ListAllMyBuckets",
        "Resource": "*"
    }, {
        "Sid": "ThirdStatement",
        "Effect": "Allow",
        "Action": ["s3:List*", "s3:Get*"
        ],
        "Resource": ["arn:aws:s3:::confidential-data", "arn:aws:s3:::confidential-data/*"
        ],
        "Condition": {"Bool": {"aws:_multi_factor_auth_present": "true"}}
    }
    ]
}

custom_policy_document = iam.PolicyDocument.from_json(policy_document)

# You can pass this document as an initial document to a ManagedPolicy
# or inline Policy.
new_managed_policy = iam.ManagedPolicy(self, "MyNewManagedPolicy",
    document=custom_policy_document
)
new_policy = iam.Policy(self, "MyNewPolicy",
    document=custom_policy_document
)

Permissions Boundaries

Permissions Boundaries can be used as a mechanism to prevent privilege esclation by creating new Roles. Permissions Boundaries are a Managed Policy, attached to Roles or Users, that represent the maximum set of permissions they can have. The effective set of permissions of a Role (or User) will be the intersection of the Identity Policy and the Permissions Boundary attached to the Role (or User). Permissions Boundaries are typically created by account Administrators, and their use on newly created Roles will be enforced by IAM policies.

It is possible to attach Permissions Boundaries to all Roles created in a construct tree all at once:

# Directly apply the boundary to a Role you create
# role: iam.Role

# Apply the boundary to an Role that was implicitly created for you
# fn: lambda.Function

# Remove a Permissions Boundary that is inherited, for example from the Stack level
# custom_resource: CustomResource
# This imports an existing policy.
boundary = iam.ManagedPolicy.from_managed_policy_arn(self, "Boundary", "arn:aws:iam::123456789012:policy/boundary")

# This creates a new boundary
boundary2 = iam.ManagedPolicy(self, "Boundary2",
    statements=[
        iam.PolicyStatement(
            effect=iam.Effect.DENY,
            actions=["iam:*"],
            resources=["*"]
        )
    ]
)
iam.PermissionsBoundary.of(role).apply(boundary)
iam.PermissionsBoundary.of(fn).apply(boundary)

# Apply the boundary to all Roles in a stack
iam.PermissionsBoundary.of(self).apply(boundary)
iam.PermissionsBoundary.of(custom_resource).clear()

OpenID Connect Providers

OIDC identity providers are entities in IAM that describe an external identity provider (IdP) service that supports the OpenID Connect (OIDC) standard, such as Google or Salesforce. You use an IAM OIDC identity provider when you want to establish trust between an OIDC-compatible IdP and your AWS account. This is useful when creating a mobile app or web application that requires access to AWS resources, but you don't want to create custom sign-in code or manage your own user identities. For more information about this scenario, see [About Web Identity Federation] and the relevant documentation in the [Amazon Cognito Identity Pools Developer Guide].

The following examples defines an OpenID Connect provider. Two client IDs (audiences) are will be able to send authentication requests to https://openid/connect.

provider = iam.OpenIdConnectProvider(self, "MyProvider",
    url="https://openid/connect",
    client_ids=["myclient1", "myclient2"]
)

You can specify an optional list of thumbprints. If not specified, the thumbprint of the root certificate authority (CA) will automatically be obtained from the host as described here.

Once you define an OpenID connect provider, you can use it with AWS services that expect an IAM OIDC provider. For example, when you define an Amazon Cognito identity pool you can reference the provider's ARN as follows:

import aws_cdk.aws_cognito as cognito

# my_provider: iam.OpenIdConnectProvider

cognito.CfnIdentityPool(self, "IdentityPool",
    open_id_connect_provider_arns=[my_provider.open_id_connect_provider_arn],
    # And the other properties for your identity pool
    allow_unauthenticated_identities=False
)

The OpenIdConnectPrincipal class can be used as a principal used with a OpenIdConnectProvider, for example:

provider = iam.OpenIdConnectProvider(self, "MyProvider",
    url="https://openid/connect",
    client_ids=["myclient1", "myclient2"]
)
principal = iam.OpenIdConnectPrincipal(provider)

SAML provider

An IAM SAML 2.0 identity provider is an entity in IAM that describes an external identity provider (IdP) service that supports the SAML 2.0 (Security Assertion Markup Language 2.0) standard. You use an IAM identity provider when you want to establish trust between a SAML-compatible IdP such as Shibboleth or Active Directory Federation Services and AWS, so that users in your organization can access AWS resources. IAM SAML identity providers are used as principals in an IAM trust policy.

iam.SamlProvider(self, "Provider",
    metadata_document=iam.SamlMetadataDocument.from_file("/path/to/saml-metadata-document.xml")
)

The SamlPrincipal class can be used as a principal with a SamlProvider:

provider = iam.SamlProvider(self, "Provider",
    metadata_document=iam.SamlMetadataDocument.from_file("/path/to/saml-metadata-document.xml")
)
principal = iam.SamlPrincipal(provider, {
    "StringEquals": {
        "SAML:iss": "issuer"
    }
})

When creating a role for programmatic and AWS Management Console access, use the SamlConsolePrincipal class:

provider = iam.SamlProvider(self, "Provider",
    metadata_document=iam.SamlMetadataDocument.from_file("/path/to/saml-metadata-document.xml")
)
iam.Role(self, "Role",
    assumed_by=iam.SamlConsolePrincipal(provider)
)

Users

IAM manages users for your AWS account. To create a new user:

user = iam.User(self, "MyUser")

To import an existing user by name with path:

user = iam.User.from_user_name(self, "MyImportedUserByName", "johnsmith")

To import an existing user by ARN:

user = iam.User.from_user_arn(self, "MyImportedUserByArn", "arn:aws:iam::123456789012:user/johnsmith")

To import an existing user by attributes:

user = iam.User.from_user_attributes(self, "MyImportedUserByAttributes",
    user_arn="arn:aws:iam::123456789012:user/johnsmith"
)

Access Keys

The ability for a user to make API calls via the CLI or an SDK is enabled by the user having an access key pair. To create an access key:

user = iam.User(self, "MyUser")
access_key = iam.AccessKey(self, "MyAccessKey", user=user)

You can force CloudFormation to rotate the access key by providing a monotonically increasing serial property. Simply provide a higher serial value than any number used previously:

user = iam.User(self, "MyUser")
access_key = iam.AccessKey(self, "MyAccessKey", user=user, serial=1)

An access key may only be associated with a single user and cannot be "moved" between users. Changing the user associated with an access key replaces the access key (and its ID and secret value).

Groups

An IAM user group is a collection of IAM users. User groups let you specify permissions for multiple users.

group = iam.Group(self, "MyGroup")

To import an existing group by ARN:

group = iam.Group.from_group_arn(self, "MyImportedGroupByArn", "arn:aws:iam::account-id:group/group-name")

To import an existing group by name with path:

group = iam.Group.from_group_name(self, "MyImportedGroupByName", "group-name")

To add a user to a group (both for a new and imported user/group):

user = iam.User(self, "MyUser") # or User.fromUserName(stack, 'User', 'johnsmith');
group = iam.Group(self, "MyGroup") # or Group.fromGroupArn(stack, 'Group', 'arn:aws:iam::account-id:group/group-name');

user.add_to_group(group)
# or
group.add_user(user)

Features

  • Policy name uniqueness is enforced. If two policies by the same name are attached to the same principal, the attachment will fail.
  • Policy names are not required - the CDK logical ID will be used and ensured to be unique.
  • Policies are validated during synthesis to ensure that they have actions, and that policies attached to IAM principals specify relevant resources, while policies attached to resources specify which IAM principals they apply to.
1.204.0 Jun 19, 2023
1.203.0 May 31, 2023
1.202.0 May 22, 2023
1.201.0 May 10, 2023
1.200.0 Apr 26, 2023
1.199.0 Apr 20, 2023
1.198.1 Mar 31, 2023
1.198.0 Mar 22, 2023
1.197.0 Mar 14, 2023
1.196.0 Mar 08, 2023
1.195.0 Mar 02, 2023
1.194.0 Feb 21, 2023
1.193.0 Feb 15, 2023
1.192.0 Feb 09, 2023
1.191.0 Jan 31, 2023
1.190.0 Jan 25, 2023
1.189.0 Jan 19, 2023
1.188.0 Jan 11, 2023
1.187.0 Jan 03, 2023
1.186.1 Dec 30, 2022
1.186.0 Dec 29, 2022
1.185.0 Dec 28, 2022
1.184.1 Dec 23, 2022
1.184.0 Dec 22, 2022
1.183.0 Dec 15, 2022
1.182.0 Dec 07, 2022
1.181.1 Nov 29, 2022
1.181.0 Nov 18, 2022
1.180.0 Nov 01, 2022
1.179.0 Oct 27, 2022
1.178.0 Oct 20, 2022
1.177.0 Oct 13, 2022
1.176.0 Oct 06, 2022
1.175.0 Sep 29, 2022
1.174.0 Sep 22, 2022
1.173.0 Sep 16, 2022
1.172.0 Sep 08, 2022
1.171.0 Aug 31, 2022
1.170.1 Aug 31, 2022
1.170.0 Aug 25, 2022
1.169.0 Aug 18, 2022
1.168.0 Aug 09, 2022
1.167.0 Aug 02, 2022
1.166.1 Jul 29, 2022
1.165.0 Jul 19, 2022
1.164.0 Jul 16, 2022
1.163.2 Jul 14, 2022
1.163.1 Jul 09, 2022
1.163.0 Jul 06, 2022
1.162.0 Jul 01, 2022
1.161.0 Jun 23, 2022
1.160.0 Jun 14, 2022
1.159.0 Jun 03, 2022
1.158.0 May 27, 2022
1.157.0 May 21, 2022
1.156.1 May 13, 2022
1.156.0 May 12, 2022
1.155.0 May 04, 2022
1.154.0 Apr 28, 2022
1.153.1 Apr 23, 2022
1.153.0 Apr 22, 2022
1.152.0 Apr 07, 2022
1.151.0 Apr 01, 2022
1.150.0 Mar 26, 2022
1.149.0 Mar 17, 2022
1.148.0 Mar 10, 2022
1.147.0 Mar 01, 2022
1.146.0 Feb 25, 2022
1.145.0 Feb 19, 2022
1.144.0 Feb 08, 2022
1.143.0 Feb 02, 2022
1.142.0 Jan 29, 2022
1.141.0 Jan 27, 2022
1.140.0 Jan 20, 2022
1.139.0 Jan 11, 2022
1.138.2 Jan 10, 2022
1.138.1 Jan 07, 2022
1.138.0 Jan 04, 2022
1.137.0 Dec 21, 2021
1.136.0 Dec 15, 2021
1.135.0 Dec 10, 2021
1.134.0 Nov 23, 2021
1.133.0 Nov 19, 2021
1.132.0 Nov 09, 2021
1.131.0 Nov 07, 2021
1.130.0 Oct 29, 2021
1.129.0 Oct 21, 2021
1.128.0 Oct 14, 2021
1.127.0 Oct 08, 2021
1.126.0 Oct 05, 2021
1.125.0 Sep 29, 2021
1.124.0 Sep 21, 2021
1.123.0 Sep 17, 2021
1.122.0 Sep 08, 2021
1.121.0 Sep 01, 2021
1.120.0 Aug 26, 2021
1.119.0 Aug 17, 2021
1.118.0 Aug 11, 2021
1.117.0 Aug 05, 2021
1.116.0 Jul 28, 2021
1.115.0 Jul 21, 2021
1.114.0 Jul 15, 2021
1.113.0 Jul 12, 2021
1.112.0 Jul 09, 2021
1.111.0 Jul 02, 2021
1.110.1 Jun 28, 2021
1.110.0 Jun 24, 2021
1.109.0 Jun 17, 2021
1.108.1 Jun 11, 2021
1.108.0 Jun 09, 2021
1.107.0 Jun 02, 2021
1.106.1 May 26, 2021
1.106.0 May 25, 2021
1.105.0 May 19, 2021
1.104.0 May 15, 2021
1.103.0 May 10, 2021
1.102.0 May 04, 2021
1.101.0 Apr 28, 2021
1.100.0 Apr 20, 2021
1.99.0 Apr 19, 2021
1.98.0 Apr 12, 2021
1.97.0 Apr 06, 2021
1.96.0 Apr 01, 2021
1.95.2 Apr 01, 2021
1.95.1 Mar 26, 2021
1.95.0 Mar 25, 2021
1.94.1 Mar 17, 2021
1.94.0 Mar 16, 2021
1.93.0 Mar 11, 2021
1.92.0 Mar 06, 2021
1.91.0 Feb 23, 2021
1.90.1 Feb 19, 2021
1.90.0 Feb 17, 2021
1.89.0 Feb 09, 2021
1.88.0 Feb 04, 2021
1.87.1 Jan 28, 2021
1.87.0 Jan 27, 2021
1.86.0 Jan 21, 2021
1.85.0 Jan 14, 2021
1.84.0 Jan 12, 2021
1.83.0 Jan 06, 2021
1.82.0 Jan 03, 2021
1.81.0 Dec 31, 2020
1.80.0 Dec 22, 2020
1.79.0 Dec 17, 2020
1.78.0 Dec 12, 2020
1.77.0 Dec 07, 2020
1.76.0 Dec 01, 2020
1.75.0 Nov 24, 2020
1.74.0 Nov 17, 2020
1.73.0 Nov 11, 2020
1.72.0 Nov 06, 2020
1.71.0 Oct 29, 2020
1.70.0 Oct 24, 2020
1.69.0 Oct 19, 2020
1.68.0 Oct 15, 2020
1.67.0 Oct 07, 2020
1.66.0 Oct 02, 2020
1.65.0 Oct 01, 2020
1.64.1 Sep 25, 2020
1.64.0 Sep 24, 2020
1.63.0 Sep 14, 2020
1.62.0 Sep 04, 2020
1.61.1 Aug 28, 2020
1.61.0 Aug 27, 2020
1.60.0 Aug 20, 2020
1.59.0 Aug 15, 2020
1.58.0 Aug 12, 2020
1.57.0 Aug 07, 2020
1.56.0 Aug 01, 2020
1.55.0 Jul 28, 2020
1.54.0 Jul 22, 2020
1.53.0 Jul 20, 2020
1.52.0 Jul 18, 2020
1.51.0 Jul 09, 2020
1.50.0 Jul 07, 2020
1.49.1 Jul 02, 2020
1.49.0 Jul 02, 2020
1.48.0 Jul 01, 2020
1.47.1 Jun 30, 2020
1.47.0 Jun 24, 2020
1.46.0 Jun 20, 2020
1.45.0 Jun 09, 2020
1.44.0 Jun 04, 2020
1.43.0 Jun 04, 2020
1.42.1 Jun 01, 2020
1.42.0 May 27, 2020
1.41.0 May 21, 2020
1.40.0 May 20, 2020
1.39.0 May 16, 2020
1.38.0 May 08, 2020
1.37.0 May 05, 2020
1.36.1 Apr 29, 2020
1.36.0 Apr 28, 2020
1.35.0 Apr 24, 2020
1.34.1 Apr 22, 2020
1.34.0 Apr 21, 2020
1.33.1 Apr 19, 2020
1.33.0 Apr 17, 2020
1.32.2 Apr 10, 2020
1.32.1 Apr 09, 2020
1.32.0 Apr 07, 2020
1.31.0 Mar 24, 2020
1.30.0 Mar 18, 2020
1.29.0 Mar 18, 2020
1.28.0 Mar 16, 2020
1.27.0 Mar 03, 2020
1.26.0 Feb 26, 2020
1.25.0 Feb 19, 2020
1.24.0 Feb 14, 2020
1.23.0 Feb 07, 2020
1.22.0 Jan 23, 2020
1.21.1 Jan 16, 2020
1.21.0 Jan 16, 2020
1.20.0 Jan 07, 2020
1.19.0 Dec 17, 2019
1.18.0 Nov 25, 2019
1.17.1 Nov 19, 2019
1.17.0 Nov 19, 2019
1.16.3 Nov 13, 2019
1.16.2 Nov 12, 2019
1.16.1 Nov 12, 2019
1.16.0 Nov 11, 2019
1.15.0 Oct 28, 2019
1.14.0 Oct 22, 2019
1.13.1 Oct 15, 2019
1.13.0 Oct 15, 2019
1.12.0 Oct 07, 2019
1.11.0 Oct 02, 2019
1.10.1 Oct 01, 2019
1.10.0 Sep 30, 2019
1.9.0 Sep 20, 2019
1.8.0 Sep 10, 2019
1.7.0 Sep 06, 2019
1.6.1 Aug 29, 2019
1.6.0 Aug 27, 2019
1.5.0 Aug 21, 2019
1.4.0 Aug 14, 2019
1.3.0 Aug 02, 2019
1.2.0 Jul 25, 2019
1.1.0 Jul 19, 2019
1.0.0 Jul 11, 2019
0.39.0 Jul 09, 2019
0.38.0 Jul 08, 2019
0.37.0 Jul 04, 2019
0.36.2 Jul 03, 2019
0.36.1 Jul 01, 2019
0.36.0 Jun 25, 2019
0.35.0 Jun 19, 2019
0.34.0 Jun 10, 2019
0.33.0 May 30, 2019
0.32.0 May 24, 2019
0.31.0 May 07, 2019
0.30.0 May 02, 2019
0.29.0 Apr 24, 2019
0.28.0 Apr 04, 2019
0.27.0 Mar 28, 2019
0.26.0 Mar 28, 2019
Extras: None
Dependencies:
aws-cdk.core (==1.204.0)
aws-cdk.cx-api (==1.204.0)
aws-cdk.region-info (==1.204.0)
constructs (<4.0.0,>=3.3.69)
jsii (<2.0.0,>=1.84.0)
publication (>=0.0.3)
typeguard (~=2.13.3)