← Files AWS CoreARCHIVED FILE

skills/aws-deployment/references/codeconnections.md

6.78 KB · Sep 30, 2026 · 22:47 UTC

↓ Download file

# CodeConnections

## Service Prefixes

Two ARN prefixes coexist (service was rebranded from CodeStar Connections to CodeConnections):

| Prefix | ARN Format |
|--------|-----------|
| `codeconnections` | `arn:aws:codeconnections:REGION:ACCOUNT:connection/UUID` |
| `codestar-connections` | `arn:aws:codestar-connections:REGION:ACCOUNT:connection/UUID` |

Both work in pipeline configurations. IAM policy prefix must match the resource ARN prefix.

## Provider Comparison

| Feature | GitHub | GitHub Enterprise | GitLab.com | GitLab Self-Managed | Bitbucket Cloud | Azure DevOps |
|---------|--------|-------------------|------------|---------------------|-----------------|--------------|
| Host resource required | No | Yes | No | Yes | No | No |
| Auth mechanism | GitHub App | GitHub App | OAuth | OAuth | OAuth | OAuth |
| Org owner required | Yes | Yes | No | No | No | No |
| VPC endpoint needed | No | Yes (if private) | No | Yes | No | No |
| Provider type value | `GitHub` | `GitHubEnterpriseServer` | `GitLab` | `GitLabSelfManaged` | `Bitbucket` | `AzureDevOps` |

## Create a Connection

```bash
aws codeconnections create-connection \
  --provider-type GitHub \
  --connection-name my-github-connection \
  --tags Key=managed_by,Value=aws-skills Key=skill,Value=deploy
```

For self-managed providers, use `--host-arn` instead of `--provider-type`:

```bash
aws codeconnections create-connection \
  --host-arn arn:aws:codeconnections:REGION:ACCOUNT:host/HOST_ID \
  --connection-name my-gitlab-sm-connection
```

Check status:

```bash
aws codeconnections get-connection --connection-arn CONNECTION_ARN \
  --query "Connection.ConnectionStatus" --output text
```

## The PENDING State Trap

Connections created via CLI/CloudFormation/CDK are **always** `PENDING`. There is NO API to complete authorization — the console OAuth handshake is mandatory.

A PENDING connection:

- Returns no errors from `create-connection`
- Passes ARN validation in pipeline definitions
- **Silently fails** when the pipeline fetches source

## Authorize a Connection (Console Required)

### GitHub / GitHub Enterprise

1. AWS Console → **Developer Tools > Settings > Connections**
2. Select PENDING connection → **Update pending connection**
3. **Install a new app** (or select existing GitHub App)
4. Browser redirects to GitHub — sign in as **organization owner**
5. Select org, choose repos → **Install**
6. Back in AWS Console → **Connect**

**Pitfall**: Non-owner members get cookie errors or blank pages. GitHub App installation REQUIRES org owner role.

### GitLab.com / GitLab Self-Managed

1. AWS Console → **Developer Tools > Settings > Connections**
2. Select PENDING connection → **Update pending connection**
3. Redirects to GitLab → authorize the AWS application
4. **Connect** to finalize

### Bitbucket Cloud

Same flow as GitLab: Console → select connection → redirect → authorize → Connect.

### Verify

```bash
aws codeconnections get-connection --connection-arn CONNECTION_ARN \
  --query "Connection.ConnectionStatus" --output text
# Expected: AVAILABLE
```

## Create a Host Resource (Self-Managed Only)

Required for GitHub Enterprise Server and GitLab Self-Managed. NOT needed for hosted providers.

```bash
aws codeconnections create-host \
  --name my-gitlab-host \
  --provider-type GitLabSelfManaged \
  --provider-endpoint https://gitlab.internal.example.com \
  --vpc-configuration VpcId=VPC_ID,SubnetIds=SUBNET_1,SUBNET_2,SecurityGroupIds=SG_ID,TlsCertificate=BASE64_PEM_CERT
```

`--vpc-configuration` required when endpoint is not publicly accessible. `TlsCertificate` accepts PEM-encoded CA cert (base64).

Host creation is async — check status:

```bash
aws codeconnections get-host --host-arn HOST_ARN --query "Status" --output text
# Wait for: AVAILABLE
```

## Connection Sharing

A single connection serves unlimited pipelines within the same account and region. Create one connection per provider per account — do not create one per pipeline.

Cross-account: share connections using AWS Resource Access Manager (RAM). See [sharing connections](https://docs.aws.amazon.com/dtconsole/latest/userguide/connections-share.html). Without RAM, each account needs its own connection.

## IAM Configuration

Use `codeconnections:` prefix for all Actions. The dual prefix only matters in the `Resource` field (to match existing ARNs):

```json
{
  "Effect": "Allow",
  "Action": [
    "codeconnections:UseConnection"
  ],
  "Resource": [
    "arn:aws:codeconnections:REGION:ACCOUNT:connection/CONNECTION_UUID",
    "arn:aws:codestar-connections:REGION:ACCOUNT:connection/OLD_CONNECTION_UUID"
  ],
  "Condition": {
    "StringEquals": {
      "codeconnections:FullRepositoryId": "org/repo"
    }
  }
}
```

**CRITICAL: UseConnection is over-permissive without condition keys.** It grants access to ALL repositories the connection can reach. MUST specify conditions:

| Condition Key | Purpose |
|--------------|---------|
| `codeconnections:FullRepositoryId` | Restrict to specific repo (e.g., `org/repo`) |
| `codeconnections:ProviderAction` | Restrict operations (e.g., `read` only) |
| `codeconnections:BranchName` | Restrict to specific branch |

For pipeline service roles: minimum `codeconnections:UseConnection` with condition keys scoped to the repo.

For CodeBuild roles using `CODEBUILD_CLONE_REF`: add `codeconnections:UseConnection` to the **CodeBuild** service role (not the pipeline role), with the same condition key scoping.

## Common Errors

| Error/Symptom | Cause | Fix |
|---------------|-------|-----|
| Pipeline fails "connection not available" | Connection PENDING | Complete OAuth in console |
| Blank page / cookie error during GitHub auth | User not org owner | Have org owner perform installation |
| `AccessDeniedException` on UseConnection | IAM only has one prefix | Add `codeconnections:UseConnection` and `codestar-connections:UseConnection` |
| Host stuck in `VPC_CONFIG_FAILED_INITIALIZATION` | VPC/subnet/SG misconfiguration | Verify route to provider endpoint, validate TLS cert |
| Pipeline trigger never fires | `sourceActionName` mismatch | Ensure trigger `sourceActionName` matches action `Name` exactly |
| Repository not found | Wrong FullRepositoryId format | Use `org/repo` format (case-sensitive) |

## Security

- MUST scope UseConnection with condition keys (FullRepositoryId, ProviderAction) — without them, any repo accessible to the connection is exposed
- Scope Resource to specific connection ARNs in production
- Enable CloudTrail for `codeconnections:*` API auditing
- Revoke connections when personnel with OAuth access leave the organization
- Connections store OAuth tokens managed by AWS — prefer connections over manual PATs which cannot be auto-rotated

## Related

- [codepipeline.md](codepipeline.md) for source action and trigger configuration
- [troubleshooting.md](troubleshooting.md) for pipeline-level debugging

SHA-256: 2211436c42412c710b62f5b3bc9d58100104c8db485ec8065cde29dec690d623