EC2のコードをCodeCommitで管理する
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は新たに作成されていることが確認できました
Discussion