aws-cdk-github-oidc 4.2.3 → 4.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.jsii CHANGED
@@ -8522,7 +8522,7 @@
8522
8522
  },
8523
8523
  "name": "aws-cdk-github-oidc",
8524
8524
  "readme": {
8525
- "markdown": "> [!IMPORTANT]\n> Migrating **to `v4`**? See [Migration Guide](#migration-guide) at the end of this README.\n\n\n# AWS CDK Github OpenID Connect\n\n![cdk-support](https://img.shields.io/badge/cdk-%20typescript%20|%20python%20-informational \"TypeScript | Python\")\n[![release](https://github.com/aripalo/aws-cdk-github-oidc/actions/workflows/release.yml/badge.svg)](https://github.com/aripalo/aws-cdk-github-oidc/actions/workflows/release.yml)\n[![codecov](https://codecov.io/gh/aripalo/aws-cdk-github-oidc/branch/main/graph/badge.svg?token=5X44RM6J17)](https://codecov.io/gh/aripalo/aws-cdk-github-oidc)\n\n---\n\nAWS [CDK](https://aws.amazon.com/cdk/) constructs that define:\n\n- Github Actions as OpenID Connect Identity Provider into AWS IAM\n- IAM Roles that can be assumed by Github Actions workflows\n\nThese constructs allows you to harden your AWS deployment security by removing the need to create long-term access keys for Github Actions and instead use OpenID Connect to Authenticate your Github Action workflow with AWS IAM.\n\n## Background information\n\n![github-aws-oidc](/assets/github-aws-oidc.svg \"Github OIDC with AWS\")\n\n- [GitHub Actions: Secure cloud deployments with OpenID Connect](https://github.blog/changelog/2021-10-27-github-actions-secure-cloud-deployments-with-openid-connect/) on Github Changelog Blog.\n- [Security hardening your deployments](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments) on Github Docs.\n- [Assuming a role with `aws-actions/configure-aws-credentials`](https://github.com/aws-actions/configure-aws-credentials#assuming-a-role).\n- Shout-out to [Richard H. Boyd](https://twitter.com/rchrdbyd) for helping me to debug Github OIDC setup with AWS IAM and his [Deploying to AWS with Github Actions](https://www.githubuniverse.com/2021/session/692586/deploying-to-aws-with-github-actions)-talk.\n- Shout-out to [Aidan W Steele](https://twitter.com/__steele) and his blog post [AWS federation comes to GitHub Actions](https://awsteele.com/blog/2021/09/15/aws-federation-comes-to-github-actions.html) for being the original inspiration for this.\n\n<br/>\n\n## Getting started\n\n```shell\npnpm add -D aws-cdk-github-oidc\n```\n\n<br/>\n\n### OpenID Connect Identity Provider trust for AWS IAM\n\nTo create a new Github OIDC provider configuration into AWS IAM:\n\n```ts\nimport { GithubActionsIdentityProvider } from \"aws-cdk-github-oidc\";\n\nconst provider = new GithubActionsIdentityProvider(scope, \"GithubProvider\");\n```\n\nIn the background this creates an OIDC provider trust configuration into AWS IAM with an [issuer URL of `https://token.actions.githubusercontent.com`](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services#adding-the-identity-provider-to-aws) and audiences (client IDs) configured as `['sts.amazonaws.com']` (which matches the [`aws-actions/configure-aws-credentials`](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services#adding-the-identity-provider-to-aws) implementation).\n\n<br/>\n\n### Retrieving a reference to an existing Github OIDC provider configuration\n\nRemember, **there can be only one (Github OIDC provider per AWS Account)**, so to retrieve a reference to existing Github OIDC provider use `fromAccount` static method:\n\n```ts\nimport { GithubActionsIdentityProvider } from \"aws-cdk-github-oidc\";\n\nconst provider = GithubActionsIdentityProvider.fromAccount(\n scope,\n \"GithubProvider\"\n);\n```\n\n<br/>\n\n### Defining a role for Github Actions workflow to assume\n\n```ts\nimport { GithubActionsRole } from \"aws-cdk-github-oidc\";\n\nconst uploadRole = new GithubActionsRole(scope, \"UploadRole\", {\n provider: provider, // reference into the OIDC provider\n owner: \"octo-org\", // your repository owner (organization or user) name\n repo: \"octo-repo\", // your repository name (without the owner name)\n filter: \"ref:refs/tags/v*\", // JWT sub suffix filter, defaults to '*'\n});\n\n// use it like any other role, for example grant S3 bucket write access:\nmyBucket.grantWrite(uploadRole);\n```\n\nYou may pass in any `iam.RoleProps` into the construct's props, except `assumedBy` which will be defined by this construct (CDK will fail if you do):\n\n```ts\nconst deployRole = new GithubActionsRole(scope, \"DeployRole\", {\n provider: provider,\n owner: \"octo-org\",\n repo: \"octo-repo\",\n roleName: \"MyDeployRole\",\n description: \"This role deploys stuff to AWS\",\n maxSessionDuration: cdk.Duration.hours(2),\n});\n\n// You may also use various \"add*\" policy methods!\n// \"AdministratorAccess\" not really a good idea, just for an example here:\ndeployRole.addManagedPolicy(\n iam.ManagedPolicy.fromAwsManagedPolicyName(\"AdministratorAccess\")\n);\n```\n\n<br/>\n\n#### Subject Filter\n\nBy default the value of `filter` property will be `'*'` which means any workflow (from given repository) from any branch, tag, environment or pull request can assume this role. To further stricten the OIDC trust policy on the role, you may adjust the subject filter as seen on the [examples in Github Docs](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect#configuring-the-oidc-trust-with-the-cloud); For example:\n\n| `filter` value | Descrition |\n| :----------------------------- | :--------------------------------------- |\n| `'ref:refs/tags/v*'` | Allow only tags with prefix of `v` |\n| `'ref:refs/heads/demo-branch'` | Allow only from branch `demo-branch` |\n| `'pull_request'` | Allow only from pull request |\n| `'environment:Production'` | Allow only from `Production` environment |\n\n<br/>\n\n### Github Actions Workflow\n\nTo actually utilize this in your Github Actions workflow, use [aws-actions/configure-aws-credentials](https://github.com/aws-actions/configure-aws-credentials) to [assume a role](https://github.com/aws-actions/configure-aws-credentials#assuming-a-role).\n\n```yaml\njobs:\n whoami:\n name: Who Am I\n runs-on: ubuntu-latest\n permissions:\n id-token: write # needed to interact with GitHub's OIDC Token endpoint.\n steps:\n - name: Configure AWS credentials\n uses: aws-actions/configure-aws-credentials@d979d5b3a71173a29b74b5b88418bfda9437d885 # v6.1.1\n with:\n role-to-assume: arn:aws:iam::123456789012:role/MyUploadRole\n #role-session-name: MySessionName # Optional\n aws-region: us-east-1\n - name: Get Caller Identity\n run: |\n aws sts get-caller-identity\n```\n\n<br/>\n\n\n## Migration Guide\n\n- [v2→v3](#v2v3)\n- [v3→v4](#v3v4)\n\n### v2→v3\n\n1. Install AWS CDK version [`v2.237.0`](https://github.com/aws/aws-cdk/releases/tag/v2.237.0) or newer required (due to support of [OIDC provider removal policy support](https://github.com/aws/aws-cdk/commit/09383cbad28336441f0fb405c9d8a190135620dc)):\n\n ```sh\n pnpm add -D aws-cdk-lib@^2.237.0\n ```\n\n2. Install `v3.1.0` (or newer v3 release) of this library:\n\n ```sh\n pnpm add -D aws-cdk-github-oidc@^3.1\n ```\n\n3. No additional steps required, as the v3 major version does not introduce any breaking changes (just a lot of internal tooling changes).\n\n### v3→v4\n\n> [!CAUTION]\n> The following steps describe a _**no-downtime** migration path_.\n> It is the recommended approach, but somewhat _involved_: Hence some users may decide to use \"destroy + redeploy\" strategy instead, which causes downtime to authenticating from GitHub Actions to AWS using OIDC.\n\n1. Ensure you are running `v3.1.0` (or newer v3 release) of this library, see [v2→v3](#v2v3).\n\n2. Configure `RETAIN` removal policy for the provider:\n\n ```diff\n const provider = new GithubActionsIdentityProvider(this, \"GithubProvider\", {\n + removalPolicy: cdk.RemovalPolicy.RETAIN,\n });\n ```\n\n3. Run `pnpm exec cdk diff`, which will show an output similar to:\n\n ```sh\n Resources\n [~] Custom::AWSCDKOpenIdConnectProvider GithubProvider/Resource GithubProvider1CDE27EB\n ├─ [~] DeletionPolicy\n │ ├─ [-] Delete\n │ └─ [+] Retain\n └─ [~] UpdateReplacePolicy\n ├─ [-] Delete\n └─ [+] Retain\n ```\n\n\n4. Deploy the changes `pnpm exec cdk deploy`\n\n5. Once the `RETAIN` removal policy has been successfully deployed, upgrade this library to `v4.2` (or newer v4 release):\n\n ```sh\n pnpm add -D aws-cdk-github-oidc@^4.2\n ```\n\n6. Temporarily change from provider initializion to provider lookup:\n\n ```diff\n - const provider = new GithubActionsIdentityProvider(this, \"GithubProvider\", {\n - removalPolicy: cdk.RemovalPolicy.RETAIN,\n - });\n + const provider = GithubActionsIdentityProvider.fromAccount(this, \"GithubProviderReference\"); // NOTICE the different construct ID\n ```\n ⚠️ **Notice the different construct ID** (in the example `GithubProviderReference` instead of ~~`GithubProvider`~~). This is required so that the CDK treats the GitHub OIDC provider lookup as a different \"thing\" and does not try to change the type of existing construct.\n\n7. Check `pnpm exec cdk diff` which should look similar to:\n ```sh\n Resources\n [-] Custom::AWSCDKOpenIdConnectProvider GithubProvider/Resource GithubProvider1CDE27EB orphan\n [-] AWS::IAM::Role Custom::AWSCDKOpenIdConnectProviderCustomResourceProvider/Role CustomAWSCDKOpenIdConnectProviderCustomResourceProviderRole517FED65 destroy\n [-] AWS::Lambda::Function Custom::AWSCDKOpenIdConnectProviderCustomResourceProvider/Handler CustomAWSCDKOpenIdConnectProviderCustomResourceProviderHandlerF2C543E0 destroy\n ```\n\n8. Deploy the changes with `pnpm exec cdk deploy`\n\n9. Once the deployment has succeeded, remove the provider lookup and replace it with the original provider initialization:\n\n ```diff\n - const provider = GithubActionsIdentityProvider.fromAccount(this, \"GithubProviderReference\");\n + const provider = new GithubActionsIdentityProvider(this, \"GithubProvider\", {\n + removalPolicy: cdk.RemovalPolicy.RETAIN,\n + });\n ```\n\n10. Copy the ARN of the existing OIDC provider, it will be in the format of:\n\n ```\n arn:aws:iam::123456789012:oidc-provider/token.actions.githubusercontent.com # REPLACE with your account ID\n ```\n\n11. Use [cdk import](https://docs.aws.amazon.com/cdk/v2/guide/ref-cli-cmd-import.html):\n\n ```sh\n pnpm exec cdk import <YOUR_STACK_NAME>\n ```\n\n ... and when asked, input the provider ARN you copied in step 10:\n ```sh\n <YOUR_STACK_NAME>/GithubProvider/Resource (AWS::IAM::OIDCProvider): enter Arn (empty to skip)\n ```\n\n12. You should be done now, but you may want to **perform manual verification** in addition to [drift detection](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/detect-drift-stack.html) and/or `cdk diff``\u001b to verify.\n\n\n\n"
8525
+ "markdown": "> [!IMPORTANT]\n> Migrating **to `v4`**? See [Migration Guide](#migration-guide) at the end of this README.\n\n\n# AWS CDK Github OpenID Connect\n\n![cdk-support](https://img.shields.io/badge/cdk-%20typescript%20|%20python%20-informational \"TypeScript | Python\")\n[![release](https://github.com/aripalo/aws-cdk-github-oidc/actions/workflows/release.yml/badge.svg)](https://github.com/aripalo/aws-cdk-github-oidc/actions/workflows/release.yml)\n[![codecov](https://codecov.io/gh/aripalo/aws-cdk-github-oidc/branch/main/graph/badge.svg?token=5X44RM6J17)](https://codecov.io/gh/aripalo/aws-cdk-github-oidc)\n\n---\n\nAWS [CDK](https://aws.amazon.com/cdk/) constructs that define:\n\n- Github Actions as OpenID Connect Identity Provider into AWS IAM\n- IAM Roles that can be assumed by Github Actions workflows\n\nThese constructs allows you to harden your AWS deployment security by removing the need to create long-term access keys for Github Actions and instead use OpenID Connect to Authenticate your Github Action workflow with AWS IAM.\n\n## Background information\n\n![github-aws-oidc](/assets/github-aws-oidc.svg \"Github OIDC with AWS\")\n\n- [GitHub Actions: Secure cloud deployments with OpenID Connect](https://github.blog/changelog/2021-10-27-github-actions-secure-cloud-deployments-with-openid-connect/) on Github Changelog Blog.\n- [Security hardening your deployments](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments) on Github Docs.\n- [Assuming a role with `aws-actions/configure-aws-credentials`](https://github.com/aws-actions/configure-aws-credentials#assuming-a-role).\n- Shout-out to [Richard H. Boyd](https://twitter.com/rchrdbyd) for helping me to debug Github OIDC setup with AWS IAM and his [Deploying to AWS with Github Actions](https://www.githubuniverse.com/2021/session/692586/deploying-to-aws-with-github-actions)-talk.\n- Shout-out to [Aidan W Steele](https://twitter.com/__steele) and his blog post [AWS federation comes to GitHub Actions](https://awsteele.com/blog/2021/09/15/aws-federation-comes-to-github-actions.html) for being the original inspiration for this.\n\n<br/>\n\n## Getting started\n\n```shell\npnpm add -D aws-cdk-github-oidc\n```\n\n<br/>\n\n### OpenID Connect Identity Provider trust for AWS IAM\n\nTo create a new Github OIDC provider configuration into AWS IAM:\n\n```ts\nimport { GithubActionsIdentityProvider } from \"aws-cdk-github-oidc\";\n\nconst provider = new GithubActionsIdentityProvider(scope, \"GithubProvider\");\n```\n\nIn the background this creates an OIDC provider trust configuration into AWS IAM with an [issuer URL of `https://token.actions.githubusercontent.com`](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services#adding-the-identity-provider-to-aws) and audiences (client IDs) configured as `['sts.amazonaws.com']` (which matches the [`aws-actions/configure-aws-credentials`](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services#adding-the-identity-provider-to-aws) implementation).\n\n<br/>\n\n### Retrieving a reference to an existing Github OIDC provider configuration\n\nRemember, **there can be only one (Github OIDC provider per AWS Account)**, so to retrieve a reference to existing Github OIDC provider use `fromAccount` static method:\n\n```ts\nimport { GithubActionsIdentityProvider } from \"aws-cdk-github-oidc\";\n\nconst provider = GithubActionsIdentityProvider.fromAccount(\n scope,\n \"GithubProvider\"\n);\n```\n\n<br/>\n\n### Defining a role for Github Actions workflow to assume\n\n```ts\nimport { GithubActionsRole } from \"aws-cdk-github-oidc\";\n\nconst uploadRole = new GithubActionsRole(scope, \"UploadRole\", {\n provider: provider, // reference into the OIDC provider\n owner: \"octo-org\", // your repository owner (organization or user) name\n repo: \"octo-repo\", // your repository name (without the owner name)\n filter: \"ref:refs/tags/v*\", // JWT sub suffix filter, defaults to '*'\n});\n\n// use it like any other role, for example grant S3 bucket write access:\nmyBucket.grantWrite(uploadRole);\n```\n\nYou may pass in any `iam.RoleProps` into the construct's props, except `assumedBy` which will be defined by this construct (CDK will fail if you do):\n\n```ts\nconst deployRole = new GithubActionsRole(scope, \"DeployRole\", {\n provider: provider,\n owner: \"octo-org\",\n repo: \"octo-repo\",\n roleName: \"MyDeployRole\",\n description: \"This role deploys stuff to AWS\",\n maxSessionDuration: cdk.Duration.hours(2),\n});\n\n// You may also use various \"add*\" policy methods!\n// \"AdministratorAccess\" not really a good idea, just for an example here:\ndeployRole.addManagedPolicy(\n iam.ManagedPolicy.fromAwsManagedPolicyName(\"AdministratorAccess\")\n);\n```\n\n<br/>\n\n#### Subject Filter\n\nBy default the value of `filter` property will be `'*'` which means any workflow (from given repository) from any branch, tag, environment or pull request can assume this role. To further stricten the OIDC trust policy on the role, you may adjust the subject filter as seen on the [examples in Github Docs](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect#configuring-the-oidc-trust-with-the-cloud); For example:\n\n| `filter` value | Descrition |\n| :----------------------------- | :--------------------------------------- |\n| `'ref:refs/tags/v*'` | Allow only tags with prefix of `v` |\n| `'ref:refs/heads/demo-branch'` | Allow only from branch `demo-branch` |\n| `'pull_request'` | Allow only from pull request |\n| `'environment:Production'` | Allow only from `Production` environment |\n\n<br/>\n\n### Github Actions Workflow\n\nTo actually utilize this in your Github Actions workflow, use [aws-actions/configure-aws-credentials](https://github.com/aws-actions/configure-aws-credentials) to [assume a role](https://github.com/aws-actions/configure-aws-credentials#assuming-a-role).\n\n```yaml\njobs:\n whoami:\n name: Who Am I\n runs-on: ubuntu-latest\n permissions:\n id-token: write # needed to interact with GitHub's OIDC Token endpoint.\n steps:\n - name: Configure AWS credentials\n uses: aws-actions/configure-aws-credentials@d979d5b3a71173a29b74b5b88418bfda9437d885 # v6.1.1\n with:\n role-to-assume: arn:aws:iam::123456789012:role/MyUploadRole\n #role-session-name: MySessionName # Optional\n aws-region: us-east-1\n - name: Get Caller Identity\n run: |\n aws sts get-caller-identity\n```\n\n<br/>\n\n\n## Migration Guide\n\n- [v2→v3](#v2v3)\n- [v3→v4](#v3v4)\n\n### v2→v3\n\n1. Install AWS CDK version [`v2.237.0`](https://github.com/aws/aws-cdk/releases/tag/v2.237.0) or newer required (due to support of [OIDC provider removal policy](https://github.com/aws/aws-cdk/commit/09383cbad28336441f0fb405c9d8a190135620dc)):\n\n ```sh\n pnpm add -D aws-cdk-lib@^2.237.0\n ```\n\n2. Install `v3.1.0` (or newer v3 release) of this library:\n\n ```sh\n pnpm add -D aws-cdk-github-oidc@^3.1\n ```\n\n3. No additional steps required, as the v3 major version does not introduce any breaking changes (just a lot of internal tooling changes).\n\n### v3→v4\n\n> [!CAUTION]\n> The following steps describe a _**no-downtime** migration path_.\n> It is the recommended approach, but somewhat _involved_: Hence some users may decide to use \"destroy + redeploy\" strategy instead, which causes downtime to authenticating from GitHub Actions to AWS using OIDC.\n\n1. Ensure you are running `v3.1.0` (or newer v3 release) of this library, see [v2→v3](#v2v3).\n\n2. Configure `RETAIN` removal policy for the provider:\n\n ```diff\n const provider = new GithubActionsIdentityProvider(this, \"GithubProvider\", {\n + removalPolicy: cdk.RemovalPolicy.RETAIN,\n });\n ```\n\n3. Run `pnpm exec cdk diff`, which will show an output similar to:\n\n ```sh\n Resources\n [~] Custom::AWSCDKOpenIdConnectProvider GithubProvider/Resource GithubProvider1CDE27EB\n ├─ [~] DeletionPolicy\n │ ├─ [-] Delete\n │ └─ [+] Retain\n └─ [~] UpdateReplacePolicy\n ├─ [-] Delete\n └─ [+] Retain\n ```\n\n\n4. Deploy the changes `pnpm exec cdk deploy`\n\n5. Once the `RETAIN` removal policy has been successfully deployed, upgrade this library to `v4.2` (or newer v4 release):\n\n ```sh\n pnpm add -D aws-cdk-github-oidc@^4.2\n ```\n\n6. Temporarily change from provider initializion to provider lookup:\n\n ```diff\n - const provider = new GithubActionsIdentityProvider(this, \"GithubProvider\", {\n - removalPolicy: cdk.RemovalPolicy.RETAIN,\n - });\n + const provider = GithubActionsIdentityProvider.fromAccount(this, \"GithubProviderReference\"); // NOTICE the different construct ID\n ```\n ⚠️ **Notice the different construct ID** (in the example `GithubProviderReference` instead of ~~`GithubProvider`~~). This is required so that the CDK treats the GitHub OIDC provider lookup as a different \"thing\" and does not try to change the type of existing construct.\n\n7. Check `pnpm exec cdk diff` which should look similar to:\n ```sh\n Resources\n [-] Custom::AWSCDKOpenIdConnectProvider GithubProvider/Resource GithubProvider1CDE27EB orphan\n [-] AWS::IAM::Role Custom::AWSCDKOpenIdConnectProviderCustomResourceProvider/Role CustomAWSCDKOpenIdConnectProviderCustomResourceProviderRole517FED65 destroy\n [-] AWS::Lambda::Function Custom::AWSCDKOpenIdConnectProviderCustomResourceProvider/Handler CustomAWSCDKOpenIdConnectProviderCustomResourceProviderHandlerF2C543E0 destroy\n ```\n\n8. Deploy the changes with `pnpm exec cdk deploy`\n\n9. Once the deployment has succeeded, remove the provider lookup and replace it with the original provider initialization:\n\n ```diff\n - const provider = GithubActionsIdentityProvider.fromAccount(this, \"GithubProviderReference\");\n + const provider = new GithubActionsIdentityProvider(this, \"GithubProvider\", {\n + removalPolicy: cdk.RemovalPolicy.RETAIN,\n + });\n ```\n\n10. Copy the ARN of the existing OIDC provider, it will be in the format of:\n\n ```\n arn:aws:iam::123456789012:oidc-provider/token.actions.githubusercontent.com # REPLACE with your account ID\n ```\n\n11. Use [cdk import](https://docs.aws.amazon.com/cdk/v2/guide/ref-cli-cmd-import.html):\n\n ```sh\n pnpm exec cdk import <YOUR_STACK_NAME>\n ```\n\n ... and when asked, input the provider ARN you copied in step 10:\n ```sh\n <YOUR_STACK_NAME>/GithubProvider/Resource (AWS::IAM::OIDCProvider): enter Arn (empty to skip)\n ```\n\n12. You should be done now, but you may want to **perform manual verification** in addition to [drift detection](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/detect-drift-stack.html) and/or `cdk diff``\u001b to verify.\n\n\n\n"
8526
8526
  },
8527
8527
  "repository": {
8528
8528
  "type": "git",
@@ -9075,6 +9075,6 @@
9075
9075
  "symbolId": "src/iam-role-props:RoleProps"
9076
9076
  }
9077
9077
  },
9078
- "version": "4.2.3",
9079
- "fingerprint": "2wBSfbl4NjZPbtA4CvGLHgrlwl8k16XH/jfq1QzleJo="
9078
+ "version": "4.2.5",
9079
+ "fingerprint": "LTZU9YOlnf1mcr4UKY3KF3J2SeSq64fZPLauWde6gMI="
9080
9080
  }
package/README.md CHANGED
@@ -149,7 +149,7 @@ jobs:
149
149
 
150
150
  ### v2→v3
151
151
 
152
- 1. Install AWS CDK version [`v2.237.0`](https://github.com/aws/aws-cdk/releases/tag/v2.237.0) or newer required (due to support of [OIDC provider removal policy support](https://github.com/aws/aws-cdk/commit/09383cbad28336441f0fb405c9d8a190135620dc)):
152
+ 1. Install AWS CDK version [`v2.237.0`](https://github.com/aws/aws-cdk/releases/tag/v2.237.0) or newer required (due to support of [OIDC provider removal policy](https://github.com/aws/aws-cdk/commit/09383cbad28336441f0fb405c9d8a190135620dc)):
153
153
 
154
154
  ```sh
155
155
  pnpm add -D aws-cdk-lib@^2.237.0
package/lib/provider.js CHANGED
@@ -55,6 +55,6 @@ class GithubActionsIdentityProvider extends iam.OidcProviderNative {
55
55
  }
56
56
  exports.GithubActionsIdentityProvider = GithubActionsIdentityProvider;
57
57
  _a = JSII_RTTI_SYMBOL_1;
58
- GithubActionsIdentityProvider[_a] = { fqn: "aws-cdk-github-oidc.GithubActionsIdentityProvider", version: "4.2.3" };
58
+ GithubActionsIdentityProvider[_a] = { fqn: "aws-cdk-github-oidc.GithubActionsIdentityProvider", version: "4.2.5" };
59
59
  GithubActionsIdentityProvider.issuer = "token.actions.githubusercontent.com";
60
60
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxtQ0FBbUM7QUFDbkMsMkNBQTJDO0FBaUIzQzs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFhLDZCQUNYLFNBQVEsR0FBRyxDQUFDLGtCQUFrQjtJQUs5Qjs7Ozs7Ozs7Ozs7O09BWUc7SUFDSSxNQUFNLENBQUMsV0FBVyxDQUN2QixLQUFnQixFQUNoQixFQUFVO1FBRVYsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBQzlDLE1BQU0sV0FBVyxHQUFHLGdCQUFnQixTQUFTLGtCQUFrQiw2QkFBNkIsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN0RyxPQUFPLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0gsWUFDRSxLQUFnQixFQUNoQixFQUFVLEVBQ1YsS0FBMEM7UUFFMUMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDZixHQUFHLEtBQUs7WUFDUixHQUFHLEVBQUUsV0FBVyw2QkFBNkIsQ0FBQyxNQUFNLEVBQUU7WUFDdEQsU0FBUyxFQUFFLENBQUMsbUJBQW1CLENBQUM7U0FDakMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUFqREgsc0VBa0RDOzs7QUE5Q3dCLG9DQUFNLEdBQVcscUNBQXFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjZGsgZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2l0aHViQWN0aW9uc0lkZW50aXR5UHJvdmlkZXJQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgcmVtb3ZhbCBwb2xpY3kgZm9yIHRoZSBwcm92aWRlci5cbiAgICpcbiAgICogQGRlZmF1bHQgY2RrLlJlbW92YWxQb2xpY3kuREVTVFJPWVxuICAgKi9cbiAgcmVhZG9ubHkgcmVtb3ZhbFBvbGljeT86IGNkay5SZW1vdmFsUG9saWN5O1xufVxuXG4vKipcbiAqIERlc2NyaWJlcyBhIEdpdGh1YiBPcGVuSUQgQ29ubmVjdCBJZGVudGl0eSBQcm92aWRlciBmb3IgQVdTIElBTS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJR2l0aHViQWN0aW9uc0lkZW50aXR5UHJvdmlkZXIgZXh0ZW5kcyBpYW0uSU9pZGNQcm92aWRlciB7fVxuXG4vKipcbiAqIEdpdGh1YiBBY3Rpb25zIGFzIE9wZW5JRCBDb25uZWN0IElkZW50aXR5IFByb3ZpZGVyIGZvciBBV1MgSUFNLlxuICogVGhlcmUgY2FuIGJlIG9ubHkgb25lIChwZXIgQVdTIEFjY291bnQpLlxuICpcbiAqIFVzZSBgZnJvbUFjY291bnRgIHRvIHJldHJpZXZlIGEgcmVmZXJlbmNlIHRvIGV4aXN0aW5nIEdpdGh1YiBPSURDIHByb3ZpZGVyLlxuICpcbiAqIFVzZXMgdGhlIG5hdGl2ZSBDbG91ZEZvcm1hdGlvbiByZXNvdXJjZSBBV1M6OklBTTo6T0lEQ1Byb3ZpZGVyIChubyBMYW1iZGEgZnVuY3Rpb25zKS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL2VuL2FjdGlvbnMvZGVwbG95bWVudC9zZWN1cml0eS1oYXJkZW5pbmcteW91ci1kZXBsb3ltZW50cy9jb25maWd1cmluZy1vcGVuaWQtY29ubmVjdC1pbi1hbWF6b24td2ViLXNlcnZpY2VzXG4gKi9cbmV4cG9ydCBjbGFzcyBHaXRodWJBY3Rpb25zSWRlbnRpdHlQcm92aWRlclxuICBleHRlbmRzIGlhbS5PaWRjUHJvdmlkZXJOYXRpdmVcbiAgaW1wbGVtZW50cyBJR2l0aHViQWN0aW9uc0lkZW50aXR5UHJvdmlkZXJcbntcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpc3N1ZXI6IHN0cmluZyA9IFwidG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb21cIjtcblxuICAvKipcbiAgICogUmV0cmlldmUgYSByZWZlcmVuY2UgdG8gZXhpc3RpbmcgR2l0aHViIE9JREMgcHJvdmlkZXIgaW4geW91ciBBV1MgYWNjb3VudC5cbiAgICogQW4gQVdTIGFjY291bnQgY2FuIG9ubHkgaGF2ZSBzaW5nbGUgR2l0aHViIE9JREMgcHJvdmlkZXIgY29uZmlndXJlZCBpbnRvIGl0LFxuICAgKiBzbyBpbnRlcm5hbGx5IHRoZSByZWZlcmVuY2UgaXMgbWFkZSBieSBjb25zdHJ1Y3RpbmcgdGhlIEFSTiBmcm9tIEFXU1xuICAgKiBBY2NvdW50IElEICYgR2l0aHViIGlzc3VlciBVUkwuXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBDREsgU3RhY2sgb3IgQ29uc3RydWN0IHRvIHdoaWNoIHRoZSBwcm92aWRlciBpcyBhc3NpZ25lZCB0b1xuICAgKiBAcGFyYW0gaWQgQ0RLIENvbnN0cnVjdCBJRCBnaXZlbiB0byB0aGUgY29uc3RydWN0XG4gICAqIEByZXR1cm5zIGEgQ0RLIENvbnN0cnVjdCByZXByZXNlbnRpbmcgdGhlIEdpdGh1YiBPSURDIHByb3ZpZGVyXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIEdpdGh1YkFjdGlvbnNJZGVudGl0eVByb3ZpZGVyLmZyb21BY2NvdW50KHNjb3BlLCBcIkdpdGh1YlByb3ZpZGVyXCIpO1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tQWNjb3VudChcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICk6IElHaXRodWJBY3Rpb25zSWRlbnRpdHlQcm92aWRlciB7XG4gICAgY29uc3QgYWNjb3VudElkID0gY2RrLlN0YWNrLm9mKHNjb3BlKS5hY2NvdW50O1xuICAgIGNvbnN0IHByb3ZpZGVyQXJuID0gYGFybjphd3M6aWFtOjoke2FjY291bnRJZH06b2lkYy1wcm92aWRlci8ke0dpdGh1YkFjdGlvbnNJZGVudGl0eVByb3ZpZGVyLmlzc3Vlcn1gO1xuICAgIHJldHVybiBpYW0uT2lkY1Byb3ZpZGVyTmF0aXZlLmZyb21PaWRjUHJvdmlkZXJBcm4oc2NvcGUsIGlkLCBwcm92aWRlckFybik7XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lIGEgbmV3IEdpdGh1YiBPcGVuSUQgQ29ubmVjdCBJZGVudGl0eSBQcm92aWRlciBmb3IgQVdTIElBTS5cbiAgICogVGhlcmUgY2FuIGJlIG9ubHkgb25lIChwZXIgQVdTIEFjY291bnQpLlxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgQ0RLIFN0YWNrIG9yIENvbnN0cnVjdCB0byB3aGljaCB0aGUgcHJvdmlkZXIgaXMgYXNzaWduZWQgdG9cbiAgICogQHBhcmFtIGlkIENESyBDb25zdHJ1Y3QgSUQgZ2l2ZW4gdG8gdGhlIGNvbnN0cnVjdFxuICAgKiBAcGFyYW0gcHJvcHMgb3B0aW9uYWwgcHJvcGVydGllcyBmb3IgdGhlIHByb3ZpZGVyXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIG5ldyBHaXRodWJBY3Rpb25zSWRlbnRpdHlQcm92aWRlcihzY29wZSwgXCJHaXRodWJQcm92aWRlclwiKTtcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wcz86IEdpdGh1YkFjdGlvbnNJZGVudGl0eVByb3ZpZGVyUHJvcHMsXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgLi4ucHJvcHMsXG4gICAgICB1cmw6IGBodHRwczovLyR7R2l0aHViQWN0aW9uc0lkZW50aXR5UHJvdmlkZXIuaXNzdWVyfWAsXG4gICAgICBjbGllbnRJZHM6IFtcInN0cy5hbWF6b25hd3MuY29tXCJdLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
package/lib/role.js CHANGED
@@ -101,5 +101,5 @@ class GithubActionsRole extends iam.Role {
101
101
  }
102
102
  exports.GithubActionsRole = GithubActionsRole;
103
103
  _a = JSII_RTTI_SYMBOL_1;
104
- GithubActionsRole[_a] = { fqn: "aws-cdk-github-oidc.GithubActionsRole", version: "4.2.3" };
104
+ GithubActionsRole[_a] = { fqn: "aws-cdk-github-oidc.GithubActionsRole", version: "4.2.5" };
105
105
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9yb2xlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsbUNBQW1DO0FBQ25DLDJDQUEyQztBQUczQyxpREFBaUQ7QUFDakQseUNBR29CO0FBb0VwQjs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFhLGlCQUFrQixTQUFRLEdBQUcsQ0FBQyxJQUFJO0lBQzdDOzs7O09BSUc7SUFDSyxNQUFNLENBQUMsZ0JBQWdCLENBQzdCLEtBQTZCO1FBRTdCLE1BQU0sWUFBWSxHQUFRLEtBQUssQ0FBQztRQUNoQyxPQUFPLFlBQVksQ0FBQyxRQUFRLENBQUM7UUFDN0IsT0FBTyxZQUFZLENBQUMsS0FBSyxDQUFDO1FBQzFCLE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQztRQUN6QixPQUFPLFlBQVksQ0FBQyxNQUFNLENBQUM7UUFDM0IsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVELDhEQUE4RDtJQUN0RCxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQWdCLEVBQUUsS0FBYTtRQUMxRCxJQUFJLHNCQUFtQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUM3QyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQ2hDLG9DQUFvQyxLQUFLLDBLQUEwSyxDQUNwTixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRCw0REFBNEQ7SUFDcEQsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFnQixFQUFFLElBQVk7UUFDeEQsSUFBSSxJQUFJLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDaEIsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUNoQyxtQ0FBbUMsSUFBSSw2QkFBNkIsQ0FDckUsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQsb0RBQW9EO0lBQzVDLE1BQU0sQ0FBQyxhQUFhLENBQUMsS0FBMEI7UUFDckQsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxHQUFHLEdBQUcsRUFBRSxHQUFHLEtBQUssQ0FBQztRQUM1QyxPQUFPLFFBQVEsS0FBSyxJQUFJLElBQUksSUFBSSxNQUFNLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7O09BaUJHO0lBQ0gsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUE2QjtRQUNyRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUM7UUFFeEMsc0JBQXNCO1FBQ3RCLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDOUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztRQUU1QyxpQkFBaUI7UUFDakIsTUFBTSxPQUFPLEdBQUcsaUJBQWlCLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sU0FBUyxHQUFHLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTVELCtCQUErQjtRQUMvQixLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNmLEdBQUcsU0FBUztZQUNaLFNBQVMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFO2dCQUNoRSxVQUFVLEVBQUU7b0JBQ1Ysb0RBQW9EO29CQUNwRCxDQUFDLEdBQUcsd0NBQTZCLENBQUMsTUFBTSxNQUFNLENBQUMsRUFBRSxPQUFPO2lCQUN6RDtnQkFDRCxZQUFZLEVBQUU7b0JBQ1osdUVBQXVFO29CQUN2RSwwS0FBMEs7b0JBQzFLLENBQUMsR0FBRyx3Q0FBNkIsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxFQUFFLG1CQUFtQjtpQkFDckU7YUFDRixDQUFDO1NBQ0gsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUFyRkgsOENBc0ZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2RrIGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgUm9sZVByb3BzIH0gZnJvbSBcIi4vaWFtLXJvbGUtcHJvcHNcIjtcbmltcG9ydCBnaXRodWJVc2VybmFtZVJlZ2V4IGZyb20gXCIuL293bmVyLXJlZ2V4cFwiO1xuaW1wb3J0IHtcbiAgR2l0aHViQWN0aW9uc0lkZW50aXR5UHJvdmlkZXIsXG4gIElHaXRodWJBY3Rpb25zSWRlbnRpdHlQcm92aWRlcixcbn0gZnJvbSBcIi4vcHJvdmlkZXJcIjtcblxuLyoqXG4gKiBHaXRodWIgcmVsYXRlZCBjb25maWd1cmF0aW9uIHRoYXQgZm9ybXMgdGhlIHRydXN0IHBvbGljeSBmb3IgdGhpcyBJQU0gUm9sZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHaXRodWJDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIFJlZmVyZW5jZSB0byBHaXRodWIgT3BlbklEIENvbm5lY3QgUHJvdmlkZXIgY29uZmlndXJlZCBpbiBBV1MgSUFNLlxuICAgKlxuICAgKiBFaXRoZXIgcGFzcyBhbiBjb25zdHJ1Y3QgZGVmaW5lZCBieSBgbmV3IEdpdGh1YkFjdGlvbnNJZGVudGl0eVByb3ZpZGVyYFxuICAgKiBvciBhIHJldHJpZXZlZCByZWZlcmVuY2UgZnJvbSBgR2l0aHViQWN0aW9uc0lkZW50aXR5UHJvdmlkZXIuZnJvbUFjY291bnRgLlxuICAgKiBUaGVyZSBjYW4gYmUgb25seSBvbmUgKHBlciBBV1MgQWNjb3VudCkuXG4gICAqL1xuICByZWFkb25seSBwcm92aWRlcjogSUdpdGh1YkFjdGlvbnNJZGVudGl0eVByb3ZpZGVyO1xuXG4gIC8qKlxuICAgKiBSZXBvc2l0b3J5IG93bmVyIChvcmdhbml6YXRpb24gb3IgdXNlcm5hbWUpLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAnb2N0by1vcmcnXG4gICAqL1xuICByZWFkb25seSBvd25lcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZXBvc2l0b3J5IG5hbWUgKHNsdWcpIHdpdGhvdXQgdGhlIG93bmVyLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAnb2N0by1yZXBvJ1xuICAgKi9cbiAgcmVhZG9ubHkgcmVwbzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTdWJqZWN0IGNvbmRpdGlvbiBmaWx0ZXIsIGFwcGVuZGVkIGFmdGVyIGByZXBvOiR7b3duZXJ9LyR7cmVwb306YCBzdHJpbmcgaW4gSUFNIFJvbGUgdHJ1c3QgcmVsYXRpb25zaGlwLlxuICAgKlxuICAgKiBAZGVmYXVsdFxuICAgKiAnKidcbiAgICpcbiAgICogWW91IG1heSB1c2UgdGhpcyB2YWx1ZSB0byBvbmx5IGFsbG93IEdpdGh1YiB0byBhc3N1bWUgdGhlIHJvbGUgb24gc3BlY2lmaWMgYnJhbmNoZXMsIHRhZ3MsIGVudmlyb25tZW50cywgcHVsbCByZXF1ZXN0cyBldGMuXG4gICAqIEBleGFtcGxlXG4gICAqICdyZWY6cmVmcy90YWdzL3YqJ1xuICAgKiAncmVmOnJlZnMvaGVhZHMvZGVtby1icmFuY2gnXG4gICAqICdwdWxsX3JlcXVlc3QnXG4gICAqICdlbnZpcm9ubWVudDpQcm9kdWN0aW9uJ1xuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL2VuL2FjdGlvbnMvZGVwbG95bWVudC9zZWN1cml0eS1oYXJkZW5pbmcteW91ci1kZXBsb3ltZW50cy9hYm91dC1zZWN1cml0eS1oYXJkZW5pbmctd2l0aC1vcGVuaWQtY29ubmVjdCNleGFtcGxlc1xuICAgKi9cbiAgcmVhZG9ubHkgZmlsdGVyPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFByb3BzIHRoYXQgZGVmaW5lIHRoZSBJQU0gUm9sZSB0aGF0IGNhbiBiZSBhc3N1bWVkIGJ5IEdpdGh1YiBBY3Rpb25zIHdvcmtmbG93XG4gKiB2aWEgR2l0aHViIE9wZW5JRCBDb25uZWN0IElkZW50aXR5IFByb3ZpZGVyLlxuICpcbiAqIEJlc2lkZXMgYEdpdGh1YkNvbmZpZ3VyYXRpb25gLCB5b3UgbWF5IHBhc3MgaW4gYW55IGBpYW0uUm9sZVByb3BzYCBleGNlcHQgYGFzc3VtZWRCeWBcbiAqIHdoaWNoIHdpbGwgYmUgZGVmaW5lZCBieSB0aGlzIGNvbnN0cnVjdCAoQ0RLIHdpbGwgZmFpbCBpZiB5b3UgZG8pLlxuICpcbiAqIEBleGFtcGxlXG4gKiB7XG4gKiAgIHByb3ZpZGVyOiBHaXRodWJBY3Rpb25zSWRlbnRpdHlQcm92aWRlci5mcm9tQWNjb3VudChzY29wZSwgXCJHaXRodWJQcm92aWRlclwiKSxcbiAqICAgb3duZXI6ICdvY3RvLW9yZycsXG4gKiAgIHJlcG86ICdvY3RvLXJlcG8nLFxuICogICBmaWx0ZXI6ICdyZWY6cmVmcy90YWdzL3YqJyxcbiAqICAgcm9sZU5hbWU6ICdNeURlcGxveVJvbGUnLFxuICogfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdpdGh1YkFjdGlvbnNSb2xlUHJvcHNcbiAgZXh0ZW5kcyBHaXRodWJDb25maWd1cmF0aW9uLCBSb2xlUHJvcHMge31cblxuLyoqXG4gKiBEZWZpbmUgYW4gSUFNIFJvbGUgdGhhdCBjYW4gYmUgYXNzdW1lZCBieSBHaXRodWIgQWN0aW9ucyB3b3JrZmxvd1xuICogdmlhIEdpdGh1YiBPcGVuSUQgQ29ubmVjdCBJZGVudGl0eSBQcm92aWRlci5cbiAqXG4gKiBCZXNpZGVzIGBHaXRodWJDb25maWd1cmF0aW9uYCwgeW91IG1heSBwYXNzIGluIGFueSBgaWFtLlJvbGVQcm9wc2AgZXhjZXB0IGBhc3N1bWVkQnlgXG4gKiB3aGljaCB3aWxsIGJlIGRlZmluZWQgYnkgdGhpcyBjb25zdHJ1Y3QgKENESyB3aWxsIGZhaWwgaWYgeW91IGRvKS5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgdXBsb2FkUm9sZSA9IG5ldyBHaXRodWJBY3Rpb25zUm9sZShzY29wZSwgXCJVcGxvYWRSb2xlXCIsIHtcbiAqICAgcHJvdmlkZXI6IEdpdGh1YkFjdGlvbnNJZGVudGl0eVByb3ZpZGVyLmZyb21BY2NvdW50KHNjb3BlLCBcIkdpdGh1YlByb3ZpZGVyXCIpLFxuICogICBvd25lcjogJ29jdG8tb3JnJyxcbiAqICAgcmVwbzogJ29jdG8tcmVwbycsXG4gKiAgIGZpbHRlcjogJ3JlZjpyZWZzL3RhZ3MvdionLFxuICogICByb2xlTmFtZTogJ015VXBsb2FkUm9sZScsXG4gKiB9KTtcbiAqXG4gKiBteUJ1Y2tldC5ncmFudFdyaXRlKHVwbG9hZFJvbGUpO1xuICovXG5leHBvcnQgY2xhc3MgR2l0aHViQWN0aW9uc1JvbGUgZXh0ZW5kcyBpYW0uUm9sZSB7XG4gIC8qKlxuICAgKiBFeHRyYWN0cyBwcm9wcyBnaXZlbiBmb3IgdGhlIGNyZWF0ZWQgSUFNIFJvbGUgQ29uc3RydWN0LlxuICAgKiBAcGFyYW0gcHJvcHMgZm9yIHRoZSBHaXRodWJBY3Rpb25zUm9sZVxuICAgKiBAcmV0dXJucyBmb3IgdGhlIElBTSBSb2xlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBleHRyYWN0Um9sZVByb3BzKFxuICAgIHByb3BzOiBHaXRodWJBY3Rpb25zUm9sZVByb3BzLFxuICApOiBpYW0uUm9sZVByb3BzIHtcbiAgICBjb25zdCBleHRyYWN0UHJvcHMgPSA8YW55PnByb3BzO1xuICAgIGRlbGV0ZSBleHRyYWN0UHJvcHMucHJvdmlkZXI7XG4gICAgZGVsZXRlIGV4dHJhY3RQcm9wcy5vd25lcjtcbiAgICBkZWxldGUgZXh0cmFjdFByb3BzLnJlcG87XG4gICAgZGVsZXRlIGV4dHJhY3RQcm9wcy5maWx0ZXI7XG4gICAgcmV0dXJuIGV4dHJhY3RQcm9wcztcbiAgfVxuXG4gIC8qKiBWYWxpZGF0ZXMgdGhlIEdpdGh1YiBvd25lciAob3JnYW5pemF0aW9uIG9yIHVzZXIpIG5hbWUuICovXG4gIHByaXZhdGUgc3RhdGljIHZhbGlkYXRlT3duZXIoc2NvcGU6IENvbnN0cnVjdCwgb3duZXI6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChnaXRodWJVc2VybmFtZVJlZ2V4LnRlc3Qob3duZXIpICE9PSB0cnVlKSB7XG4gICAgICBjZGsuQW5ub3RhdGlvbnMub2Yoc2NvcGUpLmFkZEVycm9yKFxuICAgICAgICBgSW52YWxpZCBHaXRodWIgUmVwb3NpdG9yeSBPd25lciBcIiR7b3duZXJ9XCIuIE11c3Qgb25seSBjb250YWluIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9yIGh5cGhlbnMsIGNhbm5vdCBoYXZlIG11bHRpcGxlIGNvbnNlY3V0aXZlIGh5cGhlbnMsIGNhbm5vdCBiZWdpbiBvciBlbmQgd2l0aCBhIGh5cGVuIGFuZCBtYXhpbXVtIGxlbmdodCBpcyAzOSBjaGFyYWN0ZXJzLmAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBWYWxpZGF0ZXMgdGhlIEdpdGh1YiByZXBvc2l0b3J5IG5hbWUgKHdpdGhvdXQgb3duZXIpLiAqL1xuICBwcml2YXRlIHN0YXRpYyB2YWxpZGF0ZVJlcG8oc2NvcGU6IENvbnN0cnVjdCwgcmVwbzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHJlcG8gPT09IFwiXCIpIHtcbiAgICAgIGNkay5Bbm5vdGF0aW9ucy5vZihzY29wZSkuYWRkRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIEdpdGh1YiBSZXBvc2l0b3J5IE5hbWUgXCIke3JlcG99XCIuIE1heSBub3QgYmUgZW1wdHkgc3RyaW5nLmAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBGb3JtYXRzIHRoZSBgc3ViYCB2YWx1ZSB1c2VkIGluIHRydXN0IHBvbGljeS4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZm9ybWF0U3ViamVjdChwcm9wczogR2l0aHViQ29uZmlndXJhdGlvbik6IHN0cmluZyB7XG4gICAgY29uc3QgeyBvd25lciwgcmVwbywgZmlsdGVyID0gXCIqXCIgfSA9IHByb3BzO1xuICAgIHJldHVybiBgcmVwbzoke293bmVyfS8ke3JlcG99OiR7ZmlsdGVyfWA7XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lIGFuIElBTSBSb2xlIHRoYXQgY2FuIGJlIGFzc3VtZWQgYnkgR2l0aHViIEFjdGlvbnMgd29ya2Zsb3dcbiAgICogdmlhIEdpdGh1YiBPcGVuSUQgQ29ubmVjdCBJZGVudGl0eSBQcm92aWRlci5cbiAgICpcbiAgICogQmVzaWRlcyBgR2l0aHViQ29uZmlndXJhdGlvbmAsIHlvdSBtYXkgcGFzcyBpbiBhbnkgYGlhbS5Sb2xlUHJvcHNgIGV4Y2VwdCBgYXNzdW1lZEJ5YFxuICAgKiB3aGljaCB3aWxsIGJlIGRlZmluZWQgYnkgdGhpcyBjb25zdHJ1Y3QgKENESyB3aWxsIGZhaWwgaWYgeW91IGRvKS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY29uc3QgdXBsb2FkUm9sZSA9IG5ldyBHaXRodWJBY3Rpb25zUm9sZShzY29wZSwgXCJVcGxvYWRSb2xlXCIsIHtcbiAgICogICBwcm92aWRlcjogR2l0aHViQWN0aW9uc0lkZW50aXR5UHJvdmlkZXIuZnJvbUFjY291bnQoc2NvcGUsIFwiR2l0aHViUHJvdmlkZXJcIiksXG4gICAqICAgb3duZXI6ICdvY3RvLW9yZycsXG4gICAqICAgcmVwbzogJ29jdG8tcmVwbycsXG4gICAqICAgZmlsdGVyOiAncmVmOnJlZnMvdGFncy92KicsXG4gICAqICAgcm9sZU5hbWU6ICdNeVVwbG9hZFJvbGUnLFxuICAgKiB9KTtcbiAgICpcbiAgICogbXlCdWNrZXQuZ3JhbnRXcml0ZSh1cGxvYWRSb2xlKTtcbiAgICovXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBHaXRodWJBY3Rpb25zUm9sZVByb3BzKSB7XG4gICAgY29uc3QgeyBwcm92aWRlciwgb3duZXIsIHJlcG8gfSA9IHByb3BzO1xuXG4gICAgLy8gUGVyZm9ybSB2YWxpZGF0aW9uc1xuICAgIEdpdGh1YkFjdGlvbnNSb2xlLnZhbGlkYXRlT3duZXIoc2NvcGUsIG93bmVyKTtcbiAgICBHaXRodWJBY3Rpb25zUm9sZS52YWxpZGF0ZVJlcG8oc2NvcGUsIHJlcG8pO1xuXG4gICAgLy8gUHJlcGFyZSB2YWx1ZXNcbiAgICBjb25zdCBzdWJqZWN0ID0gR2l0aHViQWN0aW9uc1JvbGUuZm9ybWF0U3ViamVjdChwcm9wcyk7XG4gICAgY29uc3Qgcm9sZVByb3BzID0gR2l0aHViQWN0aW9uc1JvbGUuZXh0cmFjdFJvbGVQcm9wcyhwcm9wcyk7XG5cbiAgICAvLyBUaGUgYWN0dWFsIElBTSBSb2xlIGNyZWF0aW9uXG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICAuLi5yb2xlUHJvcHMsXG4gICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uV2ViSWRlbnRpdHlQcmluY2lwYWwocHJvdmlkZXIub2lkY1Byb3ZpZGVyQXJuLCB7XG4gICAgICAgIFN0cmluZ0xpa2U6IHtcbiAgICAgICAgICAvLyBPbmx5IGFsbG93IHNwZWNpZmllZCBzdWJqZWN0cyB0byBhc3N1bWUgdGhpcyByb2xlXG4gICAgICAgICAgW2Ake0dpdGh1YkFjdGlvbnNJZGVudGl0eVByb3ZpZGVyLmlzc3Vlcn06c3ViYF06IHN1YmplY3QsXG4gICAgICAgIH0sXG4gICAgICAgIFN0cmluZ0VxdWFsczoge1xuICAgICAgICAgIC8vIEF1ZGllbmNlIGlzIGFsd2F5cyBzdHMuYW1hem9uYXdzLmNvbSB3aXRoIEFXUyBvZmZpY2lhbCBHaXRodWIgQWN0aW9uXG4gICAgICAgICAgLy8gaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vZW4vYWN0aW9ucy9kZXBsb3ltZW50L3NlY3VyaXR5LWhhcmRlbmluZy15b3VyLWRlcGxveW1lbnRzL2NvbmZpZ3VyaW5nLW9wZW5pZC1jb25uZWN0LWluLWFtYXpvbi13ZWItc2VydmljZXMjYWRkaW5nLXRoZS1pZGVudGl0eS1wcm92aWRlci10by1hd3NcbiAgICAgICAgICBbYCR7R2l0aHViQWN0aW9uc0lkZW50aXR5UHJvdmlkZXIuaXNzdWVyfTphdWRgXTogXCJzdHMuYW1hem9uYXdzLmNvbVwiLFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,77 @@
1
+ # Migration Test Harness
2
+
3
+ This folder contains an isolated CDK app that exercises a real migration flow for `aws-cdk-github-oidc`:
4
+
5
+ 1. `aws-cdk-github-oidc@^2` with `aws-cdk-lib@2.220.0`
6
+ 2. `aws-cdk-github-oidc@^3.1` with exact `aws-cdk-lib@2.237.0`
7
+ 3. `aws-cdk-github-oidc@^4.2` with `aws-cdk-lib@^2.237.0`
8
+
9
+ All CDK commands are executed with `pnpm exec cdk ...`.
10
+ `pnpm-workspace.yaml` in this folder mirrors the root workspace policy values.
11
+
12
+ ## Stack behavior by phase
13
+
14
+ The app reads `MIGRATION_PHASE` and switches provider implementation:
15
+
16
+ - `v2`: `new GithubActionsIdentityProvider(this, "GithubProvider")`
17
+ - `v3-retain`: same as `v2`, but with `removalPolicy: cdk.RemovalPolicy.RETAIN`
18
+ - `v4-lookup`: `GithubActionsIdentityProvider.fromAccount(this, "GithubProviderReference")`
19
+ - `v4-import`: switch back to `new GithubActionsIdentityProvider(this, "GithubProvider", { removalPolicy: RETAIN })`
20
+
21
+ ## Setup
22
+
23
+ From this directory:
24
+
25
+ ```sh
26
+ corepack use pnpm@10.19.0
27
+ pnpm install
28
+ ```
29
+
30
+ ## Run full migration flow
31
+
32
+ ```sh
33
+ pnpm run test-migration
34
+ ```
35
+
36
+ Run with automatic teardown (no prompt at the end):
37
+
38
+ ```sh
39
+ bash ./scripts/run-migration.sh --teardown
40
+ ```
41
+
42
+ Optional environment variable:
43
+
44
+ - `MIGRATION_STACK_NAME` (default: `AwsCdkGithubOidcMigrationTest`)
45
+
46
+ ## What the script does
47
+
48
+ `scripts/run-migration.sh` performs the full sequence with deploy boundaries:
49
+
50
+ 1. Install v2 + `aws-cdk-lib@2.220.0`, deploy `MIGRATION_PHASE=v2`
51
+ 2. Upgrade to v3.1 + `aws-cdk-lib@2.237.0`, diff and deploy `MIGRATION_PHASE=v3-retain`
52
+ 3. Upgrade to v4.2 + `aws-cdk-lib@^2.237.0`, diff and deploy `MIGRATION_PHASE=v4-lookup`
53
+ 4. Set `MIGRATION_PHASE=v4-import`, dynamically fetch account id via:
54
+ - `aws sts get-caller-identity --query "Account" --output text`
55
+ 5. Generate `./.tmp/resource-mapping.json` (not committed) and run:
56
+ - `pnpm exec cdk import <STACK_NAME> --resource-mapping ./.tmp/resource-mapping.json`
57
+ 6. Run `pnpm exec cdk diff` for verification
58
+
59
+ After step 6, the script asks whether to delete the test stack.
60
+ - Reply `y` or `yes` to destroy it.
61
+ - Reply `n` to keep it deployed.
62
+ - Use `--teardown` (or `--teardown=true`) to destroy without prompting.
63
+
64
+ ## Resource mapping
65
+
66
+ No AWS account IDs are stored in source control.
67
+
68
+ - Template file: `config/resource-mapping.template.json`
69
+ - Runtime file: `./.tmp/resource-mapping.json`
70
+
71
+ The generated ARN format is:
72
+
73
+ `arn:aws:iam::<ACCOUNT_ID>:oidc-provider/token.actions.githubusercontent.com`
74
+
75
+ ## Reference
76
+
77
+ - [AWS CDK `cdk import` docs](https://docs.aws.amazon.com/cdk/v2/guide/ref-cli-cmd-import.html)
@@ -0,0 +1,8 @@
1
+ import * as cdk from "aws-cdk-lib";
2
+ import { MigrationTestStack } from "../lib/migration-test-stack";
3
+
4
+ const app = new cdk.App();
5
+ const stackName =
6
+ process.env.MIGRATION_STACK_NAME ?? "AwsCdkGithubOidcMigrationTest";
7
+
8
+ new MigrationTestStack(app, stackName);
@@ -0,0 +1,6 @@
1
+ {
2
+ "app": "pnpm exec tsx bin/app.ts",
3
+ "context": {
4
+ "@aws-cdk/core:newStyleStackSynthesis": true
5
+ }
6
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "GithubProvider1CDE27EB": {
3
+ "Arn": "arn:aws:iam::__ACCOUNT_ID__:oidc-provider/token.actions.githubusercontent.com"
4
+ }
5
+ }
@@ -0,0 +1,77 @@
1
+ import * as cdk from "aws-cdk-lib";
2
+ import * as iam from "aws-cdk-lib/aws-iam";
3
+ import {
4
+ GithubActionsIdentityProvider,
5
+ GithubActionsRole,
6
+ IGithubActionsIdentityProvider,
7
+ } from "aws-cdk-github-oidc";
8
+ import { Construct } from "constructs";
9
+
10
+ type MigrationPhase = "v2" | "v3-retain" | "v4-lookup" | "v4-import";
11
+
12
+ function isMigrationPhase(value: string): value is MigrationPhase {
13
+ return (
14
+ value === "v2" ||
15
+ value === "v3-retain" ||
16
+ value === "v4-lookup" ||
17
+ value === "v4-import"
18
+ );
19
+ }
20
+
21
+ function resolvePhase(): MigrationPhase {
22
+ const phase = process.env.MIGRATION_PHASE ?? "v2";
23
+ if (isMigrationPhase(phase)) {
24
+ return phase;
25
+ }
26
+ throw new Error(
27
+ `Invalid MIGRATION_PHASE="${phase}". Valid values: v2, v3-retain, v4-lookup, v4-import.`,
28
+ );
29
+ }
30
+
31
+ function createProvider(
32
+ scope: Construct,
33
+ phase: MigrationPhase,
34
+ ): IGithubActionsIdentityProvider {
35
+ if (phase === "v4-lookup") {
36
+ return GithubActionsIdentityProvider.fromAccount(
37
+ scope,
38
+ "GithubProviderReference",
39
+ );
40
+ }
41
+
42
+ const shouldRetain = phase === "v3-retain" || phase === "v4-import";
43
+ const ProviderCtor = GithubActionsIdentityProvider as unknown as new (
44
+ scope: Construct,
45
+ id: string,
46
+ props?: { removalPolicy?: cdk.RemovalPolicy },
47
+ ) => IGithubActionsIdentityProvider;
48
+ return new ProviderCtor(scope, "GithubProvider", {
49
+ removalPolicy: shouldRetain ? cdk.RemovalPolicy.RETAIN : undefined,
50
+ });
51
+ }
52
+
53
+ export class MigrationTestStack extends cdk.Stack {
54
+ constructor(scope: Construct, id: string, props?: cdk.StackProps) {
55
+ super(scope, id, props);
56
+
57
+ const phase = resolvePhase();
58
+ const provider = createProvider(this, phase);
59
+
60
+ new GithubActionsRole(this, "GithubActionsRole", {
61
+ provider,
62
+ owner: "octo-org",
63
+ repo: "octo-repo",
64
+ filter: "ref:refs/heads/main",
65
+ roleName: "migration-test-github-actions-role",
66
+ description: "Role for validating aws-cdk-github-oidc migration flow",
67
+ managedPolicies: [
68
+ iam.ManagedPolicy.fromAwsManagedPolicyName("ReadOnlyAccess"),
69
+ ],
70
+ });
71
+
72
+ new cdk.CfnOutput(this, "MigrationPhase", { value: phase });
73
+ new cdk.CfnOutput(this, "ProviderArn", {
74
+ value: `arn:${cdk.Aws.PARTITION}:iam::${cdk.Aws.ACCOUNT_ID}:oidc-provider/${GithubActionsIdentityProvider.issuer}`,
75
+ });
76
+ }
77
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "migration-test",
3
+ "private": true,
4
+ "packageManager": "pnpm@10.19.0",
5
+ "scripts": {
6
+ "build": "tsc --noEmit",
7
+ "cdk": "pnpm exec cdk",
8
+ "synth": "pnpm exec cdk synth",
9
+ "diff": "pnpm exec cdk diff",
10
+ "deploy": "pnpm exec cdk deploy --require-approval never",
11
+ "test-migration": "bash ./scripts/run-migration.sh"
12
+ },
13
+ "dependencies": {
14
+ "aws-cdk-github-oidc": "^2.4.1",
15
+ "aws-cdk-lib": "2.220.0",
16
+ "constructs": "^10.3.0"
17
+ },
18
+ "devDependencies": {
19
+ "@types/node": "^20",
20
+ "aws-cdk": "^2",
21
+ "tsx": "^4",
22
+ "typescript": "^5"
23
+ }
24
+ }
@@ -0,0 +1,423 @@
1
+ lockfileVersion: '9.0'
2
+
3
+ settings:
4
+ autoInstallPeers: true
5
+ excludeLinksFromLockfile: false
6
+
7
+ importers:
8
+
9
+ .:
10
+ dependencies:
11
+ aws-cdk-github-oidc:
12
+ specifier: ^2.4.1
13
+ version: 2.4.1(aws-cdk-lib@2.220.0(constructs@10.6.0))(constructs@10.6.0)
14
+ aws-cdk-lib:
15
+ specifier: 2.220.0
16
+ version: 2.220.0(constructs@10.6.0)
17
+ constructs:
18
+ specifier: ^10.3.0
19
+ version: 10.6.0
20
+ devDependencies:
21
+ '@types/node':
22
+ specifier: ^20
23
+ version: 20.19.40
24
+ aws-cdk:
25
+ specifier: ^2
26
+ version: 2.1121.0
27
+ tsx:
28
+ specifier: ^4
29
+ version: 4.21.0
30
+ typescript:
31
+ specifier: ^5
32
+ version: 5.9.3
33
+
34
+ packages:
35
+
36
+ '@aws-cdk/asset-awscli-v1@2.2.242':
37
+ resolution: {integrity: sha512-4c1bAy2ISzcdKXYS1k4HYZsNrgiwbiDzj36ybwFVxEWZXVAP0dimQTCaB9fxu7sWzEjw3d+eaw6Fon+QTfTIpQ==}
38
+
39
+ '@aws-cdk/asset-node-proxy-agent-v6@2.1.1':
40
+ resolution: {integrity: sha512-We4bmHaowOPHr+IQR4/FyTGjRfjgBj4ICMjtqmJeBDWad3Q/6St12NT07leNtyuukv2qMhtSZJQorD8KpKTwRA==}
41
+
42
+ '@aws-cdk/cloud-assembly-schema@48.20.0':
43
+ resolution: {integrity: sha512-+eeiav9LY4wbF/EFuCt/vfvi/Zoxo8bf94PW5clbMraChEliq83w4TbRVy0jB9jE0v1ooFTtIjSQkowSPkfISg==}
44
+ engines: {node: '>= 18.0.0'}
45
+ bundledDependencies:
46
+ - jsonschema
47
+ - semver
48
+
49
+ '@esbuild/aix-ppc64@0.27.7':
50
+ resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==}
51
+ engines: {node: '>=18'}
52
+ cpu: [ppc64]
53
+ os: [aix]
54
+
55
+ '@esbuild/android-arm64@0.27.7':
56
+ resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==}
57
+ engines: {node: '>=18'}
58
+ cpu: [arm64]
59
+ os: [android]
60
+
61
+ '@esbuild/android-arm@0.27.7':
62
+ resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==}
63
+ engines: {node: '>=18'}
64
+ cpu: [arm]
65
+ os: [android]
66
+
67
+ '@esbuild/android-x64@0.27.7':
68
+ resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==}
69
+ engines: {node: '>=18'}
70
+ cpu: [x64]
71
+ os: [android]
72
+
73
+ '@esbuild/darwin-arm64@0.27.7':
74
+ resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==}
75
+ engines: {node: '>=18'}
76
+ cpu: [arm64]
77
+ os: [darwin]
78
+
79
+ '@esbuild/darwin-x64@0.27.7':
80
+ resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==}
81
+ engines: {node: '>=18'}
82
+ cpu: [x64]
83
+ os: [darwin]
84
+
85
+ '@esbuild/freebsd-arm64@0.27.7':
86
+ resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==}
87
+ engines: {node: '>=18'}
88
+ cpu: [arm64]
89
+ os: [freebsd]
90
+
91
+ '@esbuild/freebsd-x64@0.27.7':
92
+ resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==}
93
+ engines: {node: '>=18'}
94
+ cpu: [x64]
95
+ os: [freebsd]
96
+
97
+ '@esbuild/linux-arm64@0.27.7':
98
+ resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==}
99
+ engines: {node: '>=18'}
100
+ cpu: [arm64]
101
+ os: [linux]
102
+
103
+ '@esbuild/linux-arm@0.27.7':
104
+ resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==}
105
+ engines: {node: '>=18'}
106
+ cpu: [arm]
107
+ os: [linux]
108
+
109
+ '@esbuild/linux-ia32@0.27.7':
110
+ resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==}
111
+ engines: {node: '>=18'}
112
+ cpu: [ia32]
113
+ os: [linux]
114
+
115
+ '@esbuild/linux-loong64@0.27.7':
116
+ resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==}
117
+ engines: {node: '>=18'}
118
+ cpu: [loong64]
119
+ os: [linux]
120
+
121
+ '@esbuild/linux-mips64el@0.27.7':
122
+ resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==}
123
+ engines: {node: '>=18'}
124
+ cpu: [mips64el]
125
+ os: [linux]
126
+
127
+ '@esbuild/linux-ppc64@0.27.7':
128
+ resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==}
129
+ engines: {node: '>=18'}
130
+ cpu: [ppc64]
131
+ os: [linux]
132
+
133
+ '@esbuild/linux-riscv64@0.27.7':
134
+ resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==}
135
+ engines: {node: '>=18'}
136
+ cpu: [riscv64]
137
+ os: [linux]
138
+
139
+ '@esbuild/linux-s390x@0.27.7':
140
+ resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==}
141
+ engines: {node: '>=18'}
142
+ cpu: [s390x]
143
+ os: [linux]
144
+
145
+ '@esbuild/linux-x64@0.27.7':
146
+ resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==}
147
+ engines: {node: '>=18'}
148
+ cpu: [x64]
149
+ os: [linux]
150
+
151
+ '@esbuild/netbsd-arm64@0.27.7':
152
+ resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==}
153
+ engines: {node: '>=18'}
154
+ cpu: [arm64]
155
+ os: [netbsd]
156
+
157
+ '@esbuild/netbsd-x64@0.27.7':
158
+ resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==}
159
+ engines: {node: '>=18'}
160
+ cpu: [x64]
161
+ os: [netbsd]
162
+
163
+ '@esbuild/openbsd-arm64@0.27.7':
164
+ resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==}
165
+ engines: {node: '>=18'}
166
+ cpu: [arm64]
167
+ os: [openbsd]
168
+
169
+ '@esbuild/openbsd-x64@0.27.7':
170
+ resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==}
171
+ engines: {node: '>=18'}
172
+ cpu: [x64]
173
+ os: [openbsd]
174
+
175
+ '@esbuild/openharmony-arm64@0.27.7':
176
+ resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==}
177
+ engines: {node: '>=18'}
178
+ cpu: [arm64]
179
+ os: [openharmony]
180
+
181
+ '@esbuild/sunos-x64@0.27.7':
182
+ resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==}
183
+ engines: {node: '>=18'}
184
+ cpu: [x64]
185
+ os: [sunos]
186
+
187
+ '@esbuild/win32-arm64@0.27.7':
188
+ resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==}
189
+ engines: {node: '>=18'}
190
+ cpu: [arm64]
191
+ os: [win32]
192
+
193
+ '@esbuild/win32-ia32@0.27.7':
194
+ resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==}
195
+ engines: {node: '>=18'}
196
+ cpu: [ia32]
197
+ os: [win32]
198
+
199
+ '@esbuild/win32-x64@0.27.7':
200
+ resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==}
201
+ engines: {node: '>=18'}
202
+ cpu: [x64]
203
+ os: [win32]
204
+
205
+ '@types/node@20.19.40':
206
+ resolution: {integrity: sha512-xxx6M2IpSTnnKcR0cMvIiohkiCx20/oRPtWGbenFygKCGl3zqUzdNjQ/1V4solq1LU+dgv0nQzeGOuqkqZGg0Q==}
207
+
208
+ aws-cdk-github-oidc@2.4.1:
209
+ resolution: {integrity: sha512-zKQYPGyf5f6APG76OpOxW6P7KGY/fC6VhN1ZullxySSu6RroUH9VtVl+cJ8hYes5XvEE/ZDpx2h2fPtNwZrcVQ==}
210
+ engines: {node: '>= 16.20.0'}
211
+ peerDependencies:
212
+ aws-cdk-lib: ^2.89.0
213
+ constructs: ^10.0.0
214
+
215
+ aws-cdk-lib@2.220.0:
216
+ resolution: {integrity: sha512-mOEyPP1ymWiLnSE0xFxWjG00E1DQ5wtbcgKUmtGjxyNdoG/Qret1nDLqE43YGZEbwca43WO/a2LDuSL6+hN7Lg==}
217
+ engines: {node: '>= 18.0.0'}
218
+ peerDependencies:
219
+ constructs: ^10.0.0
220
+ bundledDependencies:
221
+ - '@balena/dockerignore'
222
+ - case
223
+ - fs-extra
224
+ - ignore
225
+ - jsonschema
226
+ - minimatch
227
+ - punycode
228
+ - semver
229
+ - table
230
+ - yaml
231
+ - mime-types
232
+
233
+ aws-cdk@2.1121.0:
234
+ resolution: {integrity: sha512-cG7CHt/SytYTfwrK+BUNQpqmS1dwhjt8z6ExKL6GK4n+8/6ZCwFzxlZWA/jUd2+Y9xPc+Q8cLKfMqGmgxEXbkg==}
235
+ engines: {node: '>= 18.0.0'}
236
+ hasBin: true
237
+
238
+ constructs@10.6.0:
239
+ resolution: {integrity: sha512-TxHOnBO5zMo/G76ykzGF/wMpEHu257TbWiIxP9K0Yv/+t70UzgBQiTqjkAsWOPC6jW91DzJI0+ehQV6xDRNBuQ==}
240
+
241
+ esbuild@0.27.7:
242
+ resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==}
243
+ engines: {node: '>=18'}
244
+ hasBin: true
245
+
246
+ fsevents@2.3.3:
247
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
248
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
249
+ os: [darwin]
250
+
251
+ get-tsconfig@4.14.0:
252
+ resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==}
253
+
254
+ resolve-pkg-maps@1.0.0:
255
+ resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
256
+
257
+ tsx@4.21.0:
258
+ resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==}
259
+ engines: {node: '>=18.0.0'}
260
+ hasBin: true
261
+
262
+ typescript@5.9.3:
263
+ resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
264
+ engines: {node: '>=14.17'}
265
+ hasBin: true
266
+
267
+ undici-types@6.21.0:
268
+ resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
269
+
270
+ snapshots:
271
+
272
+ '@aws-cdk/asset-awscli-v1@2.2.242': {}
273
+
274
+ '@aws-cdk/asset-node-proxy-agent-v6@2.1.1': {}
275
+
276
+ '@aws-cdk/cloud-assembly-schema@48.20.0': {}
277
+
278
+ '@esbuild/aix-ppc64@0.27.7':
279
+ optional: true
280
+
281
+ '@esbuild/android-arm64@0.27.7':
282
+ optional: true
283
+
284
+ '@esbuild/android-arm@0.27.7':
285
+ optional: true
286
+
287
+ '@esbuild/android-x64@0.27.7':
288
+ optional: true
289
+
290
+ '@esbuild/darwin-arm64@0.27.7':
291
+ optional: true
292
+
293
+ '@esbuild/darwin-x64@0.27.7':
294
+ optional: true
295
+
296
+ '@esbuild/freebsd-arm64@0.27.7':
297
+ optional: true
298
+
299
+ '@esbuild/freebsd-x64@0.27.7':
300
+ optional: true
301
+
302
+ '@esbuild/linux-arm64@0.27.7':
303
+ optional: true
304
+
305
+ '@esbuild/linux-arm@0.27.7':
306
+ optional: true
307
+
308
+ '@esbuild/linux-ia32@0.27.7':
309
+ optional: true
310
+
311
+ '@esbuild/linux-loong64@0.27.7':
312
+ optional: true
313
+
314
+ '@esbuild/linux-mips64el@0.27.7':
315
+ optional: true
316
+
317
+ '@esbuild/linux-ppc64@0.27.7':
318
+ optional: true
319
+
320
+ '@esbuild/linux-riscv64@0.27.7':
321
+ optional: true
322
+
323
+ '@esbuild/linux-s390x@0.27.7':
324
+ optional: true
325
+
326
+ '@esbuild/linux-x64@0.27.7':
327
+ optional: true
328
+
329
+ '@esbuild/netbsd-arm64@0.27.7':
330
+ optional: true
331
+
332
+ '@esbuild/netbsd-x64@0.27.7':
333
+ optional: true
334
+
335
+ '@esbuild/openbsd-arm64@0.27.7':
336
+ optional: true
337
+
338
+ '@esbuild/openbsd-x64@0.27.7':
339
+ optional: true
340
+
341
+ '@esbuild/openharmony-arm64@0.27.7':
342
+ optional: true
343
+
344
+ '@esbuild/sunos-x64@0.27.7':
345
+ optional: true
346
+
347
+ '@esbuild/win32-arm64@0.27.7':
348
+ optional: true
349
+
350
+ '@esbuild/win32-ia32@0.27.7':
351
+ optional: true
352
+
353
+ '@esbuild/win32-x64@0.27.7':
354
+ optional: true
355
+
356
+ '@types/node@20.19.40':
357
+ dependencies:
358
+ undici-types: 6.21.0
359
+
360
+ aws-cdk-github-oidc@2.4.1(aws-cdk-lib@2.220.0(constructs@10.6.0))(constructs@10.6.0):
361
+ dependencies:
362
+ aws-cdk-lib: 2.220.0(constructs@10.6.0)
363
+ constructs: 10.6.0
364
+
365
+ aws-cdk-lib@2.220.0(constructs@10.6.0):
366
+ dependencies:
367
+ '@aws-cdk/asset-awscli-v1': 2.2.242
368
+ '@aws-cdk/asset-node-proxy-agent-v6': 2.1.1
369
+ '@aws-cdk/cloud-assembly-schema': 48.20.0
370
+ constructs: 10.6.0
371
+
372
+ aws-cdk@2.1121.0: {}
373
+
374
+ constructs@10.6.0: {}
375
+
376
+ esbuild@0.27.7:
377
+ optionalDependencies:
378
+ '@esbuild/aix-ppc64': 0.27.7
379
+ '@esbuild/android-arm': 0.27.7
380
+ '@esbuild/android-arm64': 0.27.7
381
+ '@esbuild/android-x64': 0.27.7
382
+ '@esbuild/darwin-arm64': 0.27.7
383
+ '@esbuild/darwin-x64': 0.27.7
384
+ '@esbuild/freebsd-arm64': 0.27.7
385
+ '@esbuild/freebsd-x64': 0.27.7
386
+ '@esbuild/linux-arm': 0.27.7
387
+ '@esbuild/linux-arm64': 0.27.7
388
+ '@esbuild/linux-ia32': 0.27.7
389
+ '@esbuild/linux-loong64': 0.27.7
390
+ '@esbuild/linux-mips64el': 0.27.7
391
+ '@esbuild/linux-ppc64': 0.27.7
392
+ '@esbuild/linux-riscv64': 0.27.7
393
+ '@esbuild/linux-s390x': 0.27.7
394
+ '@esbuild/linux-x64': 0.27.7
395
+ '@esbuild/netbsd-arm64': 0.27.7
396
+ '@esbuild/netbsd-x64': 0.27.7
397
+ '@esbuild/openbsd-arm64': 0.27.7
398
+ '@esbuild/openbsd-x64': 0.27.7
399
+ '@esbuild/openharmony-arm64': 0.27.7
400
+ '@esbuild/sunos-x64': 0.27.7
401
+ '@esbuild/win32-arm64': 0.27.7
402
+ '@esbuild/win32-ia32': 0.27.7
403
+ '@esbuild/win32-x64': 0.27.7
404
+
405
+ fsevents@2.3.3:
406
+ optional: true
407
+
408
+ get-tsconfig@4.14.0:
409
+ dependencies:
410
+ resolve-pkg-maps: 1.0.0
411
+
412
+ resolve-pkg-maps@1.0.0: {}
413
+
414
+ tsx@4.21.0:
415
+ dependencies:
416
+ esbuild: 0.27.7
417
+ get-tsconfig: 4.14.0
418
+ optionalDependencies:
419
+ fsevents: 2.3.3
420
+
421
+ typescript@5.9.3: {}
422
+
423
+ undici-types@6.21.0: {}
@@ -0,0 +1,21 @@
1
+ # Copied from repository root pnpm-workspace.yaml to keep identical pnpm policies
2
+ # while keeping migration-test dependency changes isolated.
3
+
4
+ minimumReleaseAge: 4320
5
+ minimumReleaseAgeExclude:
6
+ - "@alma-cdk/construct-library"
7
+ - "aws-cdk-github-oidc"
8
+ trustPolicy: no-downgrade
9
+ trustPolicyIgnoreAfter: 20160
10
+ trustPolicyExclude:
11
+ - jsii@5.9.33
12
+ - jsii@5.9.35
13
+ nodeLinker: hoisted
14
+ resolutionMode: highest
15
+ strictDepBuilds: true
16
+ onlyBuiltDependencies:
17
+ - unrs-resolver
18
+ - lefthook
19
+ - esbuild
20
+ blockExoticSubdeps: true
21
+ overrides: {}
@@ -0,0 +1,179 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
5
+ PROJECT_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)"
6
+ cd "${PROJECT_DIR}"
7
+
8
+ AUTO_TEARDOWN="false"
9
+
10
+ usage() {
11
+ cat <<EOF
12
+ Usage: ./scripts/run-migration.sh [--teardown[=true|false]]
13
+
14
+ Options:
15
+ --teardown Perform teardown automatically without asking.
16
+ --teardown=true Same as --teardown.
17
+ --teardown=false Skip automatic teardown and ask at the end.
18
+ -h, --help Show this help message.
19
+ EOF
20
+ }
21
+
22
+ while (($# > 0)); do
23
+ case "$1" in
24
+ --teardown)
25
+ if (($# > 1)) && [[ "$2" =~ ^(true|false)$ ]]; then
26
+ AUTO_TEARDOWN="$2"
27
+ shift 2
28
+ else
29
+ AUTO_TEARDOWN="true"
30
+ shift
31
+ fi
32
+ ;;
33
+ --teardown=*)
34
+ AUTO_TEARDOWN="${1#*=}"
35
+ if [[ "${AUTO_TEARDOWN}" != "true" && "${AUTO_TEARDOWN}" != "false" ]]; then
36
+ echo "Invalid value for --teardown: ${AUTO_TEARDOWN} (expected true|false)" >&2
37
+ exit 1
38
+ fi
39
+ shift
40
+ ;;
41
+ -h | --help)
42
+ usage
43
+ exit 0
44
+ ;;
45
+ *)
46
+ echo "Unknown argument: $1" >&2
47
+ usage >&2
48
+ exit 1
49
+ ;;
50
+ esac
51
+ done
52
+
53
+ STACK_NAME="${MIGRATION_STACK_NAME:-AwsCdkGithubOidcMigrationTest}"
54
+ TMP_DIR="${PROJECT_DIR}/.tmp"
55
+ RESOURCE_MAPPING_PATH="${TMP_DIR}/resource-mapping.json"
56
+ OIDC_ISSUER="token.actions.githubusercontent.com"
57
+ ACCOUNT_ID="$(aws sts get-caller-identity --query "Account" --output text)"
58
+ CALLER_ARN="$(aws sts get-caller-identity --query "Arn" --output text)"
59
+ AWS_PARTITION="$(echo "${CALLER_ARN}" | cut -d: -f2)"
60
+ OIDC_PROVIDER_ARN="arn:${AWS_PARTITION}:iam::${ACCOUNT_ID}:oidc-provider/${OIDC_ISSUER}"
61
+
62
+ cleanup_tmp_artifacts() {
63
+ rm -f "${RESOURCE_MAPPING_PATH}"
64
+ }
65
+
66
+ trap cleanup_tmp_artifacts EXIT
67
+
68
+ verify_stack_status() {
69
+ local context="$1"
70
+ shift
71
+ local status
72
+ status="$(aws cloudformation describe-stacks --stack-name "${STACK_NAME}" --query "Stacks[0].StackStatus" --output text)"
73
+
74
+ for expected in "$@"; do
75
+ if [[ "${status}" == "${expected}" ]]; then
76
+ echo "Verified stack status after ${context}: ${status}"
77
+ return 0
78
+ fi
79
+ done
80
+
81
+ echo "Unexpected stack status after ${context}: ${status}" >&2
82
+ echo "Expected one of: $*" >&2
83
+ exit 1
84
+ }
85
+
86
+ verify_oidc_provider_present() {
87
+ local context="$1"
88
+ local listed_arn
89
+ listed_arn="$(
90
+ aws iam list-open-id-connect-providers \
91
+ --query "OpenIDConnectProviderList[?Arn=='${OIDC_PROVIDER_ARN}'].Arn | [0]" \
92
+ --output text
93
+ )"
94
+
95
+ if [[ "${listed_arn}" != "${OIDC_PROVIDER_ARN}" ]]; then
96
+ echo "OIDC provider not found after ${context}: ${OIDC_PROVIDER_ARN}" >&2
97
+ exit 1
98
+ fi
99
+
100
+ local provider_url
101
+ provider_url="$(
102
+ aws iam get-open-id-connect-provider \
103
+ --open-id-connect-provider-arn "${OIDC_PROVIDER_ARN}" \
104
+ --query "Url" \
105
+ --output text
106
+ )"
107
+
108
+ if [[ "${provider_url}" != "${OIDC_ISSUER}" ]]; then
109
+ echo "OIDC provider URL mismatch after ${context}: expected ${OIDC_ISSUER}, got ${provider_url}" >&2
110
+ exit 1
111
+ fi
112
+
113
+ echo "Verified OIDC provider after ${context}: ${OIDC_PROVIDER_ARN}"
114
+ }
115
+
116
+ teardown_stack() {
117
+ echo "==> Teardown: Destroying stack ${STACK_NAME}"
118
+ MIGRATION_PHASE=v4-import MIGRATION_STACK_NAME="${STACK_NAME}" pnpm exec cdk destroy "${STACK_NAME}" --force
119
+ }
120
+
121
+ echo "Using stack: ${STACK_NAME}"
122
+ echo "Working directory: ${PROJECT_DIR}"
123
+ echo "Using account: ${ACCOUNT_ID}"
124
+ echo "Using OIDC provider ARN: ${OIDC_PROVIDER_ARN}"
125
+ echo "Auto teardown: ${AUTO_TEARDOWN}"
126
+
127
+ mkdir -p "${TMP_DIR}"
128
+
129
+ echo "==> Phase 1: Install v2 + aws-cdk-lib@2.220.0"
130
+ pnpm add aws-cdk-github-oidc@^2 aws-cdk-lib@2.220.0
131
+ MIGRATION_PHASE=v2 MIGRATION_STACK_NAME="${STACK_NAME}" pnpm exec cdk deploy "${STACK_NAME}" --require-approval never
132
+ verify_stack_status "phase 1 deploy" CREATE_COMPLETE UPDATE_COMPLETE
133
+ verify_oidc_provider_present "phase 1 deploy"
134
+
135
+ echo "==> Phase 2: Upgrade to v3.1 + aws-cdk-lib@2.237.0 with RETAIN"
136
+ pnpm add aws-cdk-github-oidc@^3.1 aws-cdk-lib@2.237.0
137
+ MIGRATION_PHASE=v3-retain MIGRATION_STACK_NAME="${STACK_NAME}" pnpm exec cdk diff "${STACK_NAME}"
138
+ MIGRATION_PHASE=v3-retain MIGRATION_STACK_NAME="${STACK_NAME}" pnpm exec cdk deploy "${STACK_NAME}" --require-approval never
139
+ verify_stack_status "phase 2 deploy" CREATE_COMPLETE UPDATE_COMPLETE
140
+ verify_oidc_provider_present "phase 2 deploy"
141
+
142
+ echo "==> Phase 3: Upgrade to v4.2 + aws-cdk-lib@^2.237.0 and lookup provider"
143
+ pnpm add aws-cdk-github-oidc@^4.2 aws-cdk-lib@^2.237.0
144
+ MIGRATION_PHASE=v4-lookup MIGRATION_STACK_NAME="${STACK_NAME}" pnpm exec cdk diff "${STACK_NAME}"
145
+ MIGRATION_PHASE=v4-lookup MIGRATION_STACK_NAME="${STACK_NAME}" pnpm exec cdk deploy "${STACK_NAME}" --require-approval never
146
+ verify_stack_status "phase 3 deploy" CREATE_COMPLETE UPDATE_COMPLETE
147
+ verify_oidc_provider_present "phase 3 deploy"
148
+
149
+ echo "==> Phase 4: Switch back to managed provider and import"
150
+ cat > "${RESOURCE_MAPPING_PATH}" <<EOF
151
+ {
152
+ "GithubProvider1CDE27EB": {
153
+ "Arn": "${OIDC_PROVIDER_ARN}"
154
+ }
155
+ }
156
+ EOF
157
+
158
+ echo "Running non-interactive import..."
159
+ printf "y\ny\n" | MIGRATION_PHASE=v4-import MIGRATION_STACK_NAME="${STACK_NAME}" pnpm exec cdk import "${STACK_NAME}" --resource-mapping "${RESOURCE_MAPPING_PATH}" --force --execute true --require-approval never
160
+ verify_stack_status "phase 4 import" IMPORT_COMPLETE
161
+ verify_oidc_provider_present "phase 4 import"
162
+
163
+ echo "==> Phase 5: Post-import verification"
164
+ MIGRATION_PHASE=v4-import MIGRATION_STACK_NAME="${STACK_NAME}" pnpm exec cdk diff "${STACK_NAME}"
165
+ verify_oidc_provider_present "phase 5 post-import diff"
166
+
167
+ echo "Migration test flow completed successfully."
168
+
169
+ if [[ "${AUTO_TEARDOWN}" == "true" ]]; then
170
+ teardown_stack
171
+ else
172
+ read -r -p "Teardown test stack now? (y/n) " teardown_answer
173
+ teardown_answer="$(printf '%s' "${teardown_answer}" | tr '[:upper:]' '[:lower:]')"
174
+ if [[ "${teardown_answer}" == "y" || "${teardown_answer}" == "yes" ]]; then
175
+ teardown_stack
176
+ else
177
+ echo "Skipping teardown. Stack remains deployed: ${STACK_NAME}"
178
+ fi
179
+ fi
package/package.json CHANGED
@@ -65,7 +65,7 @@
65
65
  "publishConfig": {
66
66
  "access": "public"
67
67
  },
68
- "version": "4.2.3",
68
+ "version": "4.2.5",
69
69
  "jest": {
70
70
  "coverageProvider": "v8",
71
71
  "testMatch": [