The API underwent breaking changes between the 0.x and 1.x releases.
This construct is only tested with CDK 2.73.0 and later. You should upgrade to at least this version before upgrading to 1.x.
Previously, using an existing CircleCiOidcProvider
was confusing and complicated. Now, you can very easily import an
existing provider (e.g., one that's created in another stack or repo) by using the
CircleCiOidcProvider.fromOrganizationId
static method.
Before:
const provider: ManualCircleCiOidcProviderProps = {
provider: OpenIdConnectProvider.fromOpenIdConnectProviderArn(
this,
"CircleCiOidcProviderImport",
"arn:aws:iam::12345678910:oidc-provider/oidc.circleci.com/org/123e4567-e89b-12d3-a456-426614174000",
),
organizationId: "123e4567-e89b-12d3-a456-426614174000",
};
const role = new CircleCiOidcRole(this, "CircleCiOidcRole", {
circleCiOidcProvider: provider,
});
After:
const provider = CircleCiOidcProvider.fromOrganizationId(this, "123e4567-e89b-12d3-a456-426614174000");
const role = new CircleCiOidcRole(this, "CircleCiOidcRole", {
provider,
});
Much better!
The property circleCiOidcThumbprints
has been renamed to thumbprints
for brevity.
The properties circleCiOidcProvider
and circleCiProjectIds
have been renamed to provider
and projectIds
for
brevity.
Before:
const role = new CircleCiOidcRole(this, "CircleCiOidcRole", {
circleCiOidcProvider: provider,
circleCiProjectIds: ["b4f04e57-c8b2-4d80-9526-dc9b1b7a63ad"],
});
After:
const role = new CircleCiOidcRole(this, "CircleCiOidcRole", {
provider,
projectIds: ["b4f04e57-c8b2-4d80-9526-dc9b1b7a63ad"],
});
CircleCiOidcProvider
and CircleCiOidcRole
now extend CfnOIDCProvider
and Role
, respectively. This makes them
simpler to work with and more idiomatic to the CDK.
Before:
const role = new CircleCiOidcRole(this, "CircleCiOidcRole", {
circleCiOidcProvider: provider,
circleCiProjectIds: ["b4f04e57-c8b2-4d80-9526-dc9b1b7a63ad"],
});
// It was annoying to have to access role.role to add permissions
role.role.addToPolicy(
new PolicyStatement({
actions: ["s3:GetObject"],
resources: ["arn:aws:s3:::my-bucket/*"],
}),
);
bucket.grantRead(role.role);
After:
const role = new CircleCiOidcRole(this, "CircleCiOidcRole", {
provider,
projectIds: ["b4f04e57-c8b2-4d80-9526-dc9b1b7a63ad"],
});
// Now the `CircleCiOidcRole` is a `Role` and you can add permissions directly
role.addToPolicy(
new PolicyStatement({
actions: ["s3:GetObject"],
resources: ["arn:aws:s3:::my-bucket/*"],
}),
);
Because of the removal of outer constructs, you might see changes like this in your CDK diff when upgrading:
Resources
[-] AWS::IAM::OIDCProvider CircleCiOidcProvider/CircleCiOidcProvider CircleCiOidcProviderBE49A2E7 destroy
[-] AWS::IAM::Role CircleCiOidcRole/CircleCiOidcRole CircleCiOidcRoleDC0C8DDB destroy
[+] AWS::IAM::OIDCProvider CircleCiOidcProvider CircleCiOidcProvider
[+] AWS::IAM::Role CircleCiOidcRole CircleCiOidcRoleC059EF20
If applied, this diff will destroy the old CircleCiOidcProvider
and CircleCiOidcRole
and create new ones. You have
two options to deal with this internal refactoring.
- Destroy and recreate the affected providers and roles.
- Prevent the destroy by overriding the logical ID of the new providers and roles.
This is the "cleanest" option because your CDK code won't contain overrides to work around the internal refactoring.
However, you'll likely have to issue two separate cdk deploy
commands to destroy, then recreate the resources.
- Delete the old resource from your stack and run a
cdk deploy
. This will destroy the old resource. - Add the new resource to your stack and run a
cdk deploy
. This will create the new resource. Note that if you're not passing theroleName
property, you will likely get a new role name generated by CloudFormation.
NOTE: If you didn't specify an explicit roleName
when creating the CircleCiOidcRole
, you don't need to trigger two
deploys. The role name will be generated by CloudFormation and will be different from the old role name, so the new role
will be created, then the old one will be destroyed. You must trigger two deploys with the CircleCiOidcProvider
because the name is static.
If it would be disruptive to recreate your CircleCiOidcProvider
or CircleCiOidcRole
s, you can use the
.overrideLogicalId
property to keep the old logical ID and prevent the destroy.
-
Run a
cdk diff
on your stack to see the logical IDs of the old resources that would be destroyed. You'll see output like this:Resources [-] AWS::IAM::OIDCProvider CircleCiOidcProvider/CircleCiOidcProvider CircleCiOidcProviderBE49A2E7 destroy [-] AWS::IAM::Role CircleCiOidcRole/CircleCiOidcRole CircleCiOidcRoleDC0C8DDB destroy [+] AWS::IAM::OIDCProvider CircleCiOidcProvider CircleCiOidcProvider [+] AWS::IAM::Role CircleCiOidcRole CircleCiOidcRoleC059EF20
-
Grab the old logical IDs and use them to override the logical IDs of the new resources. For example:
const provider = new CircleCiOidcProvider(this, "CircleCiOidcProvider", { organizationId: "123e4567-e89b-12d3-a456-426614174000", }); provider.overrideLogicalId("CircleCiOidcProviderBE49A2E7"); const role = new CircleCiOidcRole(this, "CircleCiOidcRole", { provider: provider, }); (role.node.defaultChild as unknown as CfnResource).overrideLogicalId("CircleCiOidcRoleDC0C8DDB");
By specifying the old logical IDs, you prevent the destroy of the old resources while still using the new underlying constructs.
-
Validate that the resources will not be destroyed by running another
cdk diff
. You should see that the old resources are no longer marked for destruction.There were no differences