Skip to content

🔗 Configuración de la Conexión CodeStar de GitHub

📋 Descripción General

AWS CodeStar Connections proporciona una forma segura de conectar tus repositorios de GitHub a AWS CodePipeline sin almacenar tokens de OAuth. Este enfoque moderno:

  • Mejora la seguridad al eliminar la necesidad de tokens de acceso personales.
  • Simplifica la gestión con un manejo centralizado de conexiones.
  • Permite un control de acceso detallado a repositorios específicos.

🛠️ Implementación Paso a Paso

1️⃣ Crear la Conexión CodeStar (CLI)

Ejecuta el siguiente comando para crear una nueva conexión CodeStar de GitHub y guarda el ARN en una variable:

bash
# Crear la conexión y guardar el ARN en una variable
CONNECTION_ARN=$(aws codestar-connections create-connection \
--provider-type GitHub \
--connection-name my-github-connection \
--query 'ConnectionArn' \
--output text)

# Verificar que el ARN de la conexión se capturó correctamente
echo $CONNECTION_ARN

# Guardar el ARN de la conexión en un archivo para uso posterior
echo "export CONNECTION_ARN=$CONNECTION_ARN" > connection-config.sh

✅ Salida Esperada:

text
arn:aws:codestar-connections:us-west-2:123456789012:connection/tu-id-de-conexion

2️⃣ Autorizar la Conexión (Paso Manual)

El paso final de autorización debe realizarse en la Consola de AWS:

  1. Navega a la sección Developer Tools > Connections en la Consola de AWS.
  2. Localiza tu conexión recién creada (denominada "my-github-connection").
  3. Haz clic en "Update pending connection".
  4. Se te pedirá que inicies sesión en tu cuenta de GitHub.
  5. IMPORTANTE: Después de iniciar sesión, asegúrate de hacer clic en "Install a new app".

Instalar nueva app de GitHub

  1. Se te pedirá que inicies sesión en GitHub de nuevo.
  2. En la página de instalación, puedes elegir entre:
    • Todos los repositorios de tu cuenta de GitHub.
    • Solo repositorios seleccionados (recomendado).
  3. Selecciona "Only select repositories" y haz clic en el desplegable.
  4. Busca el repositorio "Rent-A-Room" del cual hiciste el fork.
  5. Selecciona el repositorio y haz clic en "Install and Authorize".

Seleccionar repositorio

  1. Haz clic en Connect.
  2. Una vez completado, serás redirigido de vuelta a AWS y el estado de la conexión debería cambiar a Available.

Conexión CodeStar

3️⃣ Obtener tu nombre de usuario de GitHub automáticamente

Usemos la GitHub CLI para obtener tu nombre de usuario real:

bash
# Obtener tu nombre de usuario de GitHub usando GitHub CLI
GITHUB_USERNAME=$(gh api user -q '.login')
echo "Tu nombre de usuario de GitHub: $GITHUB_USERNAME"

# Verificar que sea correcto
read -p "¿Es este tu nombre de usuario de GitHub? (s/n): " CONFIRM
if [[ $CONFIRM != "s" && $CONFIRM != "S" ]]; then
  read -p "Por favor, ingresa tu nombre de usuario de GitHub: " GITHUB_USERNAME
fi

# Configurar información del repositorio y la rama
GITHUB_REPO="Rent-A-Room"
GITHUB_BRANCH="main"

echo "Usuario GitHub: $GITHUB_USERNAME"
echo "Repositorio GitHub: $GITHUB_REPO"
echo "Rama GitHub: $GITHUB_BRANCH"

4️⃣ Crear y Enviar el Dockerfile y Archivos Requeridos

Antes de desplegar nuestro pipeline, necesitamos crear y enviar un Dockerfile y archivos de configuración relacionados a nuestro repositorio de GitHub.

bash
# Asegúrate de estar en el directorio Rent-A-Room
cd Rent-A-Room

# Hacer commit y push de todos los archivos a GitHub
git add Dockerfile nginx.conf src/ package.json
git commit -m "Add Docker configuration files for CI/CD pipeline"
git push origin main

echo "✅ Dockerfile y archivos de configuración enviados con éxito al repositorio de GitHub"

5️⃣ Descargar y Desplegar la Plantilla de CloudFormation

Ahora, descarguemos y despleguemos la plantilla de CloudFormation que configurará nuestro pipeline de CI/CD completo:

bash
# Descargar la plantilla de CloudFormation
curl -s -f https://raw.githubusercontent.com/aws-samples/aws-modernization-with-docker/main/static/infrastructure/ecs-pipeline-setup.yaml -o ecs-pipeline-setup.yaml

# Crear credenciales de Docker Hub en Secrets Manager
echo "Verificando credenciales de Docker Hub existentes en Secrets Manager..."
if ! aws secretsmanager describe-secret --secret-id dockerhub-credentials &>/dev/null; then
  echo "Secreto de credenciales de Docker Hub no encontrado. Creando nuevo secreto..."
  
  if [[ -z "$DOCKER_USERNAME" || -z "$DOCKER_TOKEN" ]]; then
    read -p "Ingresa tu nombre de usuario de Docker Hub: " DOCKER_USERNAME
    read -s -p "Ingresa tu token de Docker Hub: " DOCKER_TOKEN
    echo
  fi

  aws secretsmanager create-secret \
    --name dockerhub-credentials \
    --description "Docker Hub credentials for CI/CD pipeline" \
    --secret-string "{\"DOCKER_USERNAME\":\"$DOCKER_USERNAME\",\"DOCKER_TOKEN\":\"$DOCKER_TOKEN\"}"

  echo "✅ Secreto de credenciales de Docker Hub creado con éxito"
else
  echo "✅ El secreto de credenciales de Docker Hub ya existe"
fi

# Desplegar el stack de CloudFormation
echo "Desplegando el stack de CloudFormation..."
aws cloudformation deploy \
  --template-file ecs-pipeline-setup.yaml \
  --stack-name docker-workshop-pipeline \
  --parameter-overrides \
    GitHubOwner=$GITHUB_USERNAME \
    GitHubRepo=$GITHUB_REPO \
    GitHubBranch=$GITHUB_BRANCH \
    CodeStarConnectionArn=$CONNECTION_ARN \
  --capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM \
  --no-fail-on-empty-changeset

# Verificar el estado del despliegue
STATUS=$(aws cloudformation describe-stacks --stack-name docker-workshop-pipeline --query "Stacks[0].StackStatus" --output text)
echo "Estado del stack: $STATUS"

if [ "$STATUS" == "CREATE_COMPLETE" ] || [ "$STATUS" == "UPDATE_COMPLETE" ]; then
  echo "✅ ¡Despliegue exitoso!"
  PIPELINE_URL=$(aws cloudformation describe-stacks --stack-name docker-workshop-pipeline --query "Stacks[0].Outputs[?OutputKey=='PipelineURL'].OutputValue" --output text)
  echo "🔗 URL del Pipeline: $PIPELINE_URL"
else
  echo "⚠️ Estado del despliegue: $STATUS - Revisa la Consola de AWS para más detalles"
fi

6️⃣ Acceder al sitio web de ECS usando el Balanceador de Carga

Haz clic aquí para abrir CodePipeline en la Consola y selecciona tu pipeline. Una vez completado, puedes verificar el sitio web:

bash
# Obtener el nombre DNS del balanceador de carga
ALB_DNS=$(aws elbv2 describe-load-balancers \
    --names rent-a-room-alb \
    --query 'LoadBalancers[0].DNSName' \
    --output text)

echo "✅ URL de la Aplicación: http://$ALB_DNS"

⚠️ Solución de Problemas

  • ARN de Conexión perdido: Puedes recuperarlo con:
    bash
    aws codestar-connections list-connections --query "Connections[?ConnectionName=='my-github-connection'].ConnectionArn" --output text
  • El estado de la conexión debe aparecer como Available en la Consola de AWS.
  • Asegúrate de haber hecho un fork del repositorio Rent-A-Room.

✅ Resumen

🚀 Paso 1: Crear la conexión CodeStar vía CLI.
🔗 Paso 2: Autorizar manualmente en la consola.
🔍 Paso 3: Obtener el usuario de GitHub automáticamente.
📄 Paso 4: Enviar archivos al repositorio.
📦 Paso 5: Desplegar el stack de CloudFormation.
🌐 Paso 6: Acceder a la aplicación vía Load Balancer.

Released under the GPL-3.0 License.