AWS Lightsail Contaainess를 GitLab CI로 설계

실물


실제 시도된 코드의 창고는여기.이다.

IAM 권한


AWS Constore의 GUI 설정을 사용하면 컨테이너 관계에 GUI 설정이 없는 것 같은데요?
Resource도 제한할 수 있다면 더욱 좋습니다.
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": [
        "lightsail:CreateContainerServiceRegistryLogin",
        "lightsail:RegisterContainerImage",
        "lightsail:GetContainerImages",
        "lightsail:CreateContainerServiceDeployment"
      ],
      "Resource": "*"
    }
  ]
}

.gitlab-ci.yml


본체 deploy.쉬랑 분리돼서 짧아요.
services:
  - docker:dind

app-deploy:
  image: ytoune/aws-lightsail-cli
  stage: deploy
  script:
    - echo start
    - sh ./deploy.sh
  only:
    - main

ytoune/aws-lightsail-cli


사용한 이미지는 여기.입니다.
이번 용도로 새로 지었어요.
후술aws lightsail push-container-image은 모든aws-cli,lightsailctl,docker를 요구하기 때문에
docker를 기본적으로 aws-cli와lightsailctl에 넣었습니다.
가공용 노드.js도 넣었어요.

deploy.sh


사용하지 않은 것 같아서$AWS_ACCESS_KEY_ID$AWS_SECRET_ACCESS_KEY 생성된 것 같아서~/.aws/credentials.docker build 이후aws lightsail push-container-image에서push 이미지aws lightsail create-container-service-deployment 설계 중입니다.
set -Ceu

mkdir ~/.aws || echo pass
echo '[default]' >| ~/.aws/credentials
echo "aws_access_key_id=$AWS_ACCESS_KEY_ID" >> ~/.aws/credentials
echo "aws_secret_access_key=$AWS_SECRET_ACCESS_KEY" >> ~/.aws/credentials
echo '[default]' >| ~/.aws/config
echo 'region=ap-northeast-1' >> ~/.aws/config
echo 'output=json' >> ~/.aws/config

docker build -t myapp .

aws lightsail push-container-image --region ap-northeast-1 --service-name ${APP_SERVICE_NAME} --label api --image myapp
aws lightsail get-container-images --service-name ${APP_SERVICE_NAME} | node scripts/make-container.js
aws lightsail create-container-service-deployment --service-name ${APP_SERVICE_NAME} --cli-input-json file://$(pwd)/container.json

scripts/make-container.js

aws lightsail create-container-service-deployment에서 사용된container.json.
const fs = require('fs/promises')
const path = require('path')
Promise.resolve()
  .then(async () => {
    const data = await fs.readFile('/dev/stdin', 'utf-8')
    const r = JSON.parse(data)
    const image = r.containerImages[0].image
    await fs.writeFile(
      path.join(__dirname, '../container.json'),
      JSON.stringify({
        containers: {
          api: {
            image,
            command: ['sh', 'start.sh'],
            environment: {},
            ports: {
              80: 'HTTP',
            },
          },
        },
        publicEndpoint: {
          containerName: 'api',
          containerPort: 80,
          healthCheck: {
            healthyThreshold: 2,
            unhealthyThreshold: 2,
            timeoutSeconds: 3,
            intervalSeconds: 5,
            path: '/api/health',
            successCodes: '200-499',
          },
        },
      }),
    )
  })
  .catch(x => {
    console.error(x)
    process.exit(1)
  })

개선 방안


나는 도커 메이커가 어쨌든 시간이 걸릴 것 같아서 방법을 강구해서 해결했다.
매번 어딘가에서push로 좋은 인상을 만들어요.
다음에 그 풀을 떨어뜨리면 더 빠를 수도 있어.
docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY_IMAGE
docker pull $CI_REGISTRY_IMAGE:latest || true
docker build --cache-from $CI_REGISTRY_IMAGE:latest --tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA --tag $CI_REGISTRY_IMAGE:latest .
docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
docker push $CI_REGISTRY_IMAGE:latest

참고 자료


Amazon Lightsail 컨테이너 서비스에서 개인 컨테이너 이미지 사용
Amazon Lightsail API Reference
AWS Lightsail Contaainess를 GiitHub Actions로 설계합니다.
Building Docker images with GitLab CI/CD # Using Docker caching

좋은 웹페이지 즐겨찾기