いつも記事を読んでいただきありがとうございます!
モブエンジニア(@mob-engineer)です!
業務内でCodeBuild⇒CodeDeployのパイプライン構築のキャッチアップに少し難儀していましたので、自身のスキル向上を兼ねてハンズオン記事をまとめてみたいと思います。
初見の方でもサクッと読めるように平易な表現で執筆しておりますので、お気軽に読んでいただければ幸いです。
目次
- 対象読者
- 完成イメージ
- ハンズオン
- その0:事前準備
- その1:IAMロール・S3設定
- その2:EC2構築(RHEL10)
- その3:Code Build設定
- その4:Code Deploy設定
- その5:実行結果
- 所感
対象読者
次のような課題を抱えている方に本記事を活用いただければ幸いです。
- AWSパイプラインに対して苦手意識を持っている方
- パイプライン周りのスキルを強化したい方
- ハンズオンを通じてパイプラインの理解を深めたい方
完成イメージ
完成イメージとして次のような形を考えています。
- GitHub:フロント(Spihinx)コード管理
- Code Build:ビルド(Sphinx生成)
- Code Deploy:デプロイ(生成物をEC2へ展開)
- S3:Build生成物を格納
ハンズオン
その0:事前準備
サンプルコードについては次のGitHubに作成しています。
サンプルコードを自身のGitHubへForkしてください。
その1:IAMロール・S3設定
最初にS3を作成しましょう。
- 検索ボックスにS3と入力します
- 検索結果のうちS3をクリックします
- 画面中央のバケットを作成ボタンをクリック
- バケット名に任意の名前を入力します
- 最下部へスクロールしバケットを作成ボタンをクリックします
- 作成したバケットが表示されていることを確認します
これでS3バケットの作成は完了しました。
次にIAMロールを作成します。
- 検索ボックスにIAMと入力します
- 検索結果のうちIAMをクリックします
- 左側ペインのポリシーをクリックします
- 画面右側のポリシーの作成をクリックします
- ポリシー作成画面から以下ポリシーを作成します
AWSCodePipelineServiceRole
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetBucketAcl",
"s3:GetBucketLocation",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:GetObjectVersion",
"s3:ListBucket",
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::your-codepipeline-artifacts-bucket",
"arn:aws:s3:::your-codepipeline-artifacts-bucket/*"
]
},
{
"Effect": "Allow",
"Action": [
"codebuild:BatchGetBuilds",
"codebuild:StartBuild"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"codedeploy:CreateDeployment",
"codedeploy:GetApplication",
"codedeploy:GetApplicationRevision",
"codedeploy:GetDeployment",
"codedeploy:GetDeploymentConfig",
"codedeploy:RegisterApplicationRevision"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"codestar-connections:UseConnection"
],
"Resource": "*"
}
]
}
AWSCodeBuildServiceRole
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Resource": "*",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
]
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:GetObjectVersion",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::your-codepipeline-artifacts-bucket",
"arn:aws:s3:::your-codepipeline-artifacts-bucket/*"
]
}
]
}
- 作成後、ロールを作成します。
EC2InstanceRole
(EC2インスタンス用)
AWSCodePipelineServiceRole
(Code Pipeline用)
AWSCodeBuildServiceRole
(Code Build用)
AWSCodeDeployServiceRole
(Code Deploy用)
その2:EC2構築(RHEL10)
EC2を構築する前にあらかじめセキュリティグループを作成します。
- 検索ボックスにEC2と入力します
- 検索結果よりEC2をクリックします
- 左側ペインよりセキュリティグループをクリックします
- 画面右側のセキュリティグループを作成ボタンをクリックします
- セキュリティグループ作成画面が表示されるため任意の値を入れておきます
- インバウンド・アウトバウンドを次の通り設定します
- 左側ペインよりインスタンスをクリックします
- 右側上部のインスタンスの作成をクリックします
EC2作成に関してはセキュリティグループ以外デフォルトのため割愛いたします
- 起動完了後、WebSVサーバへTeraterm接続します
- 接続後、以下コマンドを実行します
sudo yum update -y
sudo yum install -y ruby wget httpd
cd /home/ec2-user
wget https://aws-codedeploy-ap-northeast-1.s3.ap-northeast-1.amazonaws.com/latest/codedeploy-agent.noarch.rpm
sudo yum install -y ./codedeploy-agent.noarch.rpm
sudo systemctl start codedeploy-agent
sudo systemctl status codedeploy-agent
sudo systemctl start httpd
sudo systemctl enable httpd
sudo systemctl status httpd
- 設定後、EC2InstanceRoleを割り当ててください
その3:Code Build設定
次のような設定を行ってください
その4:Code Deploy設定
- Code Deploy用のアプリケーションを次の通り作成してください
- デプロイグループを次のように作成します
その5:実行結果
パイプラインを作成し実行してみました。
実行したところ、以下エラーが表示されました。
ポリシーの権限不足判明したため、以下ポリシーをAWSCodePipelineServiceRoleに追加しました。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetBucketAcl",
"s3:GetBucketLocation",
"s3:GetBucketVersioning",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:GetObjectVersion",
"s3:ListBucket",
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::codepipeline-ap-northeast-1-71a30834a9be-4ec0-a2b9-981224e19677",
"arn:aws:s3:::codepipeline-ap-northeast-1-71a30834a9be-4ec0-a2b9-981224e19677/*"
]
}
]
}
実行したところ、Deploy時にEC2の権限不足エラーが出たため
以下インラインポリシーをEC2InstanceRoleに追加しました。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:GetObjectVersion",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::sphinx-handson-20250526",
"arn:aws:s3:::sphinx-handson-20250526/*"
]
},
{
"Effect": "Allow",
"Action": [
"codedeploy:CreateDeployment",
"codedeploy:GetApplication",
"codedeploy:GetDeployment",
"codedeploy:GetDeploymentConfig",
"codedeploy:ListApplications",
"codedeploy:ListDeployments"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"ec2:DescribeInstances",
"ec2:DescribeInstanceStatus"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"tag:GetResources"
],
"Resource": "*"
}
]
}
改めて実行したところエラーが解消しました。
ホストへアクセスしてみましょう!!
無事アクセスできました。
とりあえず、今回のゴールは実現できました。
所感
個人的にCode Deployエラーの対処に時間がかかりましたが、
数をこなせばそこまで労せず実施できるといった印象を持ちました。
そのうえで、今回実装したケースは最小構成ですので、他サービスと組み合わせることで拡張性高く運用を行えると感じました。
パイプライン周りについてはまだまだキャッチアップしないといけないと感じていましたので、
引き続きアウトプット活動を行っていきたいと思います。
最後まで、記事をお読みいただきありがとうございました。































