|
| 1 | +import { |
| 2 | + CreateOpenIDConnectProviderCommand, |
| 3 | + GetOpenIDConnectProviderCommand, |
| 4 | + IAMClient, |
| 5 | + ListOpenIDConnectProvidersCommand, |
| 6 | +} from '@aws-sdk/client-iam' |
| 7 | +import chalk from 'chalk' |
| 8 | + |
| 9 | +/** |
| 10 | + * Returns the ARN of the OpenID Connect provider for GitHub of the account. |
| 11 | + */ |
| 12 | +export const ensureGitHubOIDCProvider = async ({ |
| 13 | + iam, |
| 14 | +}: { |
| 15 | + iam: IAMClient |
| 16 | +}): Promise<string> => { |
| 17 | + const { OpenIDConnectProviderList } = await iam.send( |
| 18 | + new ListOpenIDConnectProvidersCommand({}), |
| 19 | + ) |
| 20 | + |
| 21 | + const maybeGithubProvider = ( |
| 22 | + await Promise.all( |
| 23 | + OpenIDConnectProviderList?.map(async ({ Arn }) => |
| 24 | + iam |
| 25 | + .send( |
| 26 | + new GetOpenIDConnectProviderCommand({ |
| 27 | + OpenIDConnectProviderArn: Arn, |
| 28 | + }), |
| 29 | + ) |
| 30 | + .then((provider) => ({ Arn, provider })), |
| 31 | + ) ?? [], |
| 32 | + ) |
| 33 | + ).find( |
| 34 | + ({ provider: { Url } }) => Url === 'token.actions.githubusercontent.com', |
| 35 | + ) |
| 36 | + |
| 37 | + if (maybeGithubProvider?.Arn !== undefined) { |
| 38 | + console.debug( |
| 39 | + chalk.green( |
| 40 | + `OIDC provider for GitHub exists: ${maybeGithubProvider.Arn}`, |
| 41 | + ), |
| 42 | + ) |
| 43 | + return maybeGithubProvider.Arn |
| 44 | + } |
| 45 | + |
| 46 | + console.log( |
| 47 | + chalk.yellow(`OIDC provider for GitHub does not exist. Creating ...`), |
| 48 | + ) |
| 49 | + |
| 50 | + const provider = await iam.send( |
| 51 | + new CreateOpenIDConnectProviderCommand({ |
| 52 | + Url: `https://token.actions.githubusercontent.com`, |
| 53 | + ClientIDList: ['sts.amazonaws.com'], |
| 54 | + ThumbprintList: ['6938fd4d98bab03faadb97b34396831e3780aea1'], |
| 55 | + }), |
| 56 | + ) |
| 57 | + |
| 58 | + if (provider.OpenIDConnectProviderArn === undefined) |
| 59 | + throw new Error(`Failed to create OpenID Connect Provider for GitHub!`) |
| 60 | + |
| 61 | + return provider.OpenIDConnectProviderArn |
| 62 | +} |
0 commit comments