4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【ハンズオン】CodeBuild+CodeDeployを使って簡単Webサーバを構築しよう(Sphinx)

4
Posted at

いつも記事を読んでいただきありがとうございます!
モブエンジニア(@mob-engineer)です!

業務内でCodeBuild⇒CodeDeployのパイプライン構築のキャッチアップに少し難儀していましたので、自身のスキル向上を兼ねてハンズオン記事をまとめてみたいと思います。

初見の方でもサクッと読めるように平易な表現で執筆しておりますので、お気軽に読んでいただければ幸いです。

目次

  • 対象読者
  • 完成イメージ
  • ハンズオン
    • その0:事前準備
    • その1:IAMロール・S3設定
    • その2:EC2構築(RHEL10)
    • その3:Code Build設定
    • その4:Code Deploy設定
    • その5:実行結果
  • 所感

対象読者

次のような課題を抱えている方に本記事を活用いただければ幸いです。

  • AWSパイプラインに対して苦手意識を持っている方
  • パイプライン周りのスキルを強化したい方
  • ハンズオンを通じてパイプラインの理解を深めたい方

完成イメージ

完成イメージとして次のような形を考えています。

image.png

  • GitHub:フロント(Spihinx)コード管理
  • Code Build:ビルド(Sphinx生成)
  • Code Deploy:デプロイ(生成物をEC2へ展開)
  • S3:Build生成物を格納

ハンズオン

その0:事前準備

サンプルコードについては次のGitHubに作成しています。
サンプルコードを自身のGitHubへForkしてください。

その1:IAMロール・S3設定

最初にS3を作成しましょう。

  • 検索ボックスにS3と入力します
  • 検索結果のうちS3をクリックします

image.png

  • 画面中央のバケットを作成ボタンをクリック

image.png

  • バケット名に任意の名前を入力します

image.png

  • 最下部へスクロールしバケットを作成ボタンをクリックします

image.png

  • 作成したバケットが表示されていることを確認します

image.png

これでS3バケットの作成は完了しました。
次にIAMロールを作成します。

  • 検索ボックスにIAMと入力します
  • 検索結果のうちIAMをクリックします

image.png

  • 左側ペインのポリシーをクリックします
  • 画面右側のポリシーの作成をクリックします

image.png

  • ポリシー作成画面から以下ポリシーを作成します

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インスタンス用)

image.png

image.png

AWSCodePipelineServiceRole
(Code Pipeline用)

image.png

image.png

AWSCodeBuildServiceRole
(Code Build用)

image.png

image.png

AWSCodeDeployServiceRole
(Code Deploy用)

image.png

image.png

その2:EC2構築(RHEL10)

EC2を構築する前にあらかじめセキュリティグループを作成します。

  • 検索ボックスにEC2と入力します
  • 検索結果よりEC2をクリックします

image.png

  • 左側ペインよりセキュリティグループをクリックします
  • 画面右側のセキュリティグループを作成ボタンをクリックします

image.png

  • セキュリティグループ作成画面が表示されるため任意の値を入れておきます

image.png

  • インバウンド・アウトバウンドを次の通り設定します

image.png

  • 左側ペインよりインスタンスをクリックします
  • 右側上部のインスタンスの作成をクリックします

image.png

EC2作成に関してはセキュリティグループ以外デフォルトのため割愛いたします

  • 起動完了後、WebSVサーバへTeraterm接続します

image.png

  • 接続後、以下コマンドを実行します
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を割り当ててください

image.png

その3:Code Build設定

次のような設定を行ってください

image.png

image.png

image.png

その4:Code Deploy設定

  • Code Deploy用のアプリケーションを次の通り作成してください

image.png

  • デプロイグループを次のように作成します

image.png

image.png

その5:実行結果

パイプラインを作成し実行してみました。
実行したところ、以下エラーが表示されました。

image.png

ポリシーの権限不足判明したため、以下ポリシーを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": "*"
        }
    ]
}

改めて実行したところエラーが解消しました。

image.png

ホストへアクセスしてみましょう!!

image.png

無事アクセスできました。
とりあえず、今回のゴールは実現できました。

所感

個人的にCode Deployエラーの対処に時間がかかりましたが、
数をこなせばそこまで労せず実施できるといった印象を持ちました。

そのうえで、今回実装したケースは最小構成ですので、他サービスと組み合わせることで拡張性高く運用を行えると感じました。

パイプライン周りについてはまだまだキャッチアップしないといけないと感じていましたので、
引き続きアウトプット活動を行っていきたいと思います。

最後まで、記事をお読みいただきありがとうございました。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?