🔖

EC2のコードをCodeCommitで管理する

2024/08/16に公開

EC2にあるShell Script等のファイルをCodeCommitで管理するための方法です
CodeBuildでrsyncコマンドを実行するだけですが、いくつか注意点があります

キーペアを作成してEC2を起動します

※キーペアの中身は後で使用します

※Security GroupはCodeBuildから接続できるようにします
 ここでは、EC2とCodeBuild両方に「default」のSecurity Groupを割り当てることで対応します

EC2に任意のコードを作成します

「/home/ec2-user」に「code」ディレクトリを作成して、適当にファイルを作成します
また、ディレクトリやファイルのパーミッション(ec2-user)に気を付けてください
※CodeCommitのファイルに同期されることを確認するための仮のファイルのため、この手順はスキップしても問題ありません

Secrets Managerにキーペア(秘密鍵)を登録します

作成画面



作成した後の画面

VPC Endpointを作成します

CodeBuildはSubnet上に起動するとプライベート接続しかできないため、NAT Gatewayもしくは4つのVPC Endpointを作成する必要があります

  • s3
  • secretsmanager
  • git-codecommit
  • logs

CodeCommitにEC2へ同期したいコードを作成します

codeディレクトリに同期したいコードを作成します


buildspec.ymlの例です
シークレット名やEC2のプライベートIPアドレスは、合わせてください

# 1. Secrets Managerは、key-valueタイプではなく、plaintextタイプにすること
# 2. CodeBuildは、Public Subnetに起動してもグローバルIPアドレスが割り当てられないため、NAT gatewayもしくはVPC Endpointを作成しておくこと

version: 0.2

env:
  secrets-manager:
    SSH_KEY: "plaintext-ssh-key"

phases:
  pre_build:
    commands:
      - echo "Setting up SSH"
      - mkdir -p ~/.ssh
      - echo "$SSH_KEY" > ~/.ssh/id_rsa
      - chmod 600 ~/.ssh/id_rsa
  build:
    commands:
      - echo "Starting rsync to EC2 instance"
      - rsync --delete -r -e "ssh -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa" ./code ec2-user@172.31.2.91:/home/ec2-user/

CodeBuildとCodePipelineを設定します





※CodeBuildのIAM Roleに、「SecretsManagerReadWrite」ポリシーをアタッチして、SecretsManagerからシークレット情報を取得できるようにします


※CodePipelineはデフォルト設定のみのため割愛します

CodeCommitとEC2の同期を確認します

「--delete」オプションによってCodeCommitにないREADME.md等のファイルは削除され、test3.shは新たに作成されていることが確認できました

GitHubで編集を提案

Discussion