LoginSignup
1
0

AWS Code サービス群を活用して、CI/CD のための構成

Posted at

目次

・趣旨目標
・参考サイト
・使用するサービス
・勝手なイメージ
・ハンズオン
・リソースの削除
・さいごに

趣旨目標

ハンズオンを通じて基礎知識を身に付ける!Code群のサービスが少し謎なので理解!

参考サイト

使用するサービス

CodeCommit, AWS CodeBuild, AWS CodeDeploy, AWS CodePipeline

勝手なイメージ

ハンズオンする前は、GitHubとの違いを理解するのに最初は苦しみました。

ハンズオン

S3を使ったCI/CD環境を構築

・リージョンをチェック
・S3作成
image.png
静的webサイトホスティングとして使用するので、赤枠のチェックを外しちゃいます。
image.png

プロパティから、静的webサイトホスティングの編集で、有効に設定します。
image.png
「index.html」を指定しておきます。
image.png
アクセス許可のタブから、バケットポリシーを編集していきます。
次のポリシーは、S3のオブジェクトを読み取りすることができる設定とするものです。なお、Resourceの箇所はバケット名を入れます。

{
  "Version": "2012-10-17",
  "Statement": [
      {
          "Sid": "PublicReadGetObject",
          "Effect": "Allow",
          "Principal": "*",
          "Action": [
              "s3:GetObject"
          ],
          "Resource": [
              "arn:aws:s3:::xxxxxxxxx/*"
          ]
      }
  ]
}

image.png

オブジェクトをアップロードをしていきます。
オブジェクトタブから、ハンズオンサイトにあるファイルをダウンロードして、index.htmlデータをアップロードします。(ご自分で作成しても良いかと。)
image.png
image.png

S3のURLをブラウザに貼り付けることで、次のhtmlが表示されたらOKです。
image.png
画面を保持してタブを複製して作業を続けましょう。

CodeCommitを設定していく

リポジトリを作成します。
image.png
image.png
画面を保持してタブを複製して作業を続けましょう。

Cloud9を使用します。

テキストエディタの発展版のような存在ですね。協同で接続して開発が可能なようです。もっと売れて良さそう|д゚)
環境を作成していきます。
重い作業を行う場合は、インスタンスタイプを大きくしましょう。今回は最小でいきます。また、自動でEC2インスタンスを停める時間を設定できるのですが、今回の設定では時間切れにはなりませんが、結構長めに設定した方が作業環境としては快適です。
image.png
image.png
image.png
「開く」から設定を開始します。

インデントの設定を行います。
赤枠内「雲マーク」から「Soft Tabs」をyamlに合わせて「2」に設定します。
codeをcommitするために、認証ヘルパーというコードを実行して環境を構築します。

蛇足:
gitをローカルにインストールしてマネジメントコンソールからgitcommit用のユーザー名とパスを生成する方法もあると思います。gitをインストールしたらIAMからパス等を生成しましょう。
image.png
パスは必ずダウンロードしましょう。あとは、S3の画面でクローンのコマンドが表示されているので、git自体のユーザー名とアドレス設定を行った後に、ローカルのターミナルで実行して使用しましょう。

git自体のグローバルでの名前

ターミナル
git config --global user.name "あなたの名前"

アドレス設定

ターミナル
git config --global user.email "あなたのメールアドレス"

私の場合のS3に記載されているクローンのコマンド

ターミナル
git clone https://git-codecommit.us-east-1.amazonaws.com/v1/repos/keiji-hanson-commit

現状リポジトリが空ですが、これでローカルで実行可能です。
ここで蛇足終わりです。

本線に復帰します。
「AWS 認証ヘルパー」とブラウザで検索して、gitが認証を必要とするたびに、認証情報を提供するために次のコマンドを実行。

公式サイト:
https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/setting-up-https-unixes.html

Cloud9
git config --global credential.helper '!aws codecommit credential-helper $@'
git config --global credential.UseHttpPath true

昔懐かしのgitの初期設定を放り込みます。
グローバルでの名前

Cloud9
git config --global user.name "あなたの名前"

アドレスを指定

Cloud9
git config --global user.email "あなたのメールアドレス"

Cloud9のターミナルでこれまでのコマンドを実行可能なことを確認したら、gitのルートディレクトリに移動し、ブランチ名が(master)であることを確認します。
ルートディレクトリが不明である場合は、CodeCommitで設定したリポジトリ名の数文字を入力してTabキーを押下することで、ルートディレクトリを表示してくれます。もちろん記憶していればそのまま記載しても良いです。

Cloud9
例:cd keiji-hanson-commit/

image.png
(pwdコマンドは実行しなくても大丈夫です。)

次にCloud9上にもハンズオン資料のindex.htmlをアップロードしていきます。
image.png

リポジトリ内が空であることを確認しておく。
image.png

gitコマンドを実行してきます。
変更された箇所の全てをステージングして。

Cloud9
git add -A

ステージングされた全てをコミットします。

Cloud9
git commit -m "init"

リポジトリにアップロードする。

Cloud9
git push origin master

image.png

今こんな感じ
image.png

次は赤枠のS3宛てとEC2宛てのパイプライン計2本を作成していく。

image.png

【ここで少しお勉強です。(私見盛りだくさんなので無視可)】

1 全般、一言で表現するとgitのブランチとかの感じ。
ブランチとして分ける場合は、パイプラインを分けて作成することで実現できるようです。
2 パイプラインタイプというものは、V1 タイプ、V2 タイプに価格と自由度が分かれており、自由度高く設定できる。デフォはV2タイプ。gitに慣れている方はこちらにしないと困りそう。
公式サイトでの説明:
https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/pipeline-types.html

本編に戻ります。

先にCdodePipelineから作成します。
V2 タイプ(デフォルト)で作成を進めます。
Pipelineを2つ作成します。最初はS3に対してのPipeline作成。
image.png
image.png

ここで各ステージ間で受け渡しされる変数を作成することができます。また、Lambdaを介すことで動的に変数を設定させることもできるようです。
image.png
変数の設定細部:
https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/reference-variables.html

S3を作成する設定や、KMSキーを使用するかを選べる。
今回は先に作成したS3を指定していきます。
image.png
接続先を選択します。S3やCodeCommit、gitなどを選択できます。
image.png
masterのみで、ソースはCodeCommitで設定します。
また、WatchEventsで自動的に変更される設定(デフォルト)とします。
image.png

蛇足:
githubを接続することが可能です。バージョン2を選択し、接続することでgithub上で変更を行うとCI/CD機能が働き、各本番、テスト環境などで自動的に実行される環境が作成できます。
image.png
image.png
githubと接続するためのアプリのインストールを行います。
image.png
image.png
数字が自動的に入りますね。このまま実行していまうと、接続が確立されてしまうので、ハンズオンの本編に帰ります|д゚)
image.png

本編に戻ります。

ビルドステージはスキップします。
S3宛てのパイプラインであり、CodeBuildを介さないためです。
image.png

デプロイステージではS3を宛先に作成していきます。
image.png
image.png
オプションが多く設定されていますね。
image.png
このまま次に進み、パイプラインを作成します。
image.png

次にS3へのコミットができるか確認します。
image.png
保存し忘れること多しなので、保存をして、コマンドでコミットしていきます。
コミットの際はコメントを任意に入力する必要があります。
ここで更に注意事項ですが、gitのリポジトリ(gitと繋がったディレクトリ)があるディレクリに移動する必要があります。
pwdコマンドやlsコマンドで移動すべきディレクトリに移動しましょう。
早速、add、commitとpushを行います。
add

Cloud9
git add -A

commit

Cloud9
git commit -m "update"

push

Cloud9
git push origin master

image.png
できました。
image.png
image.png

EC2にwebサーバーを構築する。

IAMロールの作成
image.png
EC2を選択
image.png
S3フルアクセスを選択
image.png
image.png

EC2作成
image.png
image.png
image.png
image.png
ネットワーク設定は、HTTPを許可する設定を追加します。
image.png
image.png
image.png

先程作成したIAMロールを設定します。
image.png
image.png
image.png
image.png
image.png
image.png
image.png
インスタンスに接続します。
image.png
yumを最新へ。

sudo yum update -y

Apacheをインストール

sudo yum install httpd -y

Apacheの起動

sudo systemctl start httpd.service

Apache自動起動設定

sudo systemctl enable httpd.service

EC2のパブリックアドレスをブラウザへペーストすると次のwelcomeが表示されます。
image.png

次にCodeDeployのLinux用エージェントをインストールします。
公式サイト:
https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/codedeploy-agent-operations-install-linux.html
Rubyをインストール

sudo yum install ruby

ファイルをダウンロードするためもの

sudo yum install wget

私の場合のインストーラーのコマンド。こちらを確認ください。
https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/resource-kit.html#resource-kit-bucket-names

wget https://aws-codedeploy-us-east-1.s3.us-east-1.amazonaws.com/latest/install

ディレクトリに権限を与えてから

chmod +x ./install

権限を確認していきます。

ls -la

image.png
CodeDeploy エージェントの最新バージョンをインストール

sudo ./install auto

サービスが実行されているかどうか確認

systemctl status codedeploy-agent

image.png
ここまででEC2の初期設定完了!

S3を作成します。

CloudBuildで作成したアーティファクト(成果物)を格納するためのS3を作成します。
image.png
今回はwebホスティングしないので公開せず、デフォルト作成。
image.png

CodeBuildを設定

image.png
ここの追加設定には同時ビルドの設定などが可能ですね。
image.png
CodePipelineで設定した内容に合わせブランチを選択します。
image.png
image.png
Linuxを選択し、最新のイメージ、バージョンを選択します。
動画などの処理を行うこともないので、GPU 強化コンピューティングにはチェックを付けません。
image.png
image.png
追加設定はマニアックですね。貼っておきますので参考までに。
image.png
image.png
image.png
動的な振る舞いを決めることができる箇所
特定のタグを自動で付ける等、少しだけアレンジできるようです。
image.png
image.png
先程作成したS3を選択していきます。
image.png
image.png
image.png
ログも取れるようです。
image.png
image.png

ここでIAMロールにポリシーをアタッチしていきます。
IAMの画面へ移動し、CodeBuildからCodeDeployにアクセス可能にするため、IAMロールの画面で「CodeBuild」と検索し、作成されたロールを発見します。その後、ポリシーを画像のように追加します。
image.png
image.png

私の場合「keiji-hanson-commit」直下にファイル「buildspec.yml」ディレクトリ「src」を作成。そして「index.html」を「keiji-hanson-commit」へドラック&ドロップで格納する。
image.png

buildspec.ymlを作成します。

この後にCodeDeployにpushするので、その際の動作(アプリの名前決め)を決めるために、コードを作成します。
公式サイト:
https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/build-spec-ref.html

※修正前:このコードは完成ではありません。

このテンプレートが公式サイトにありますのでコピーしてきます。

yml
# ビルドスペックのバージョンを指定
version: 0.2

# フェーズ分けしますよ。
phases:

# HelloWorld_spec.rbというRubyテスト実行コードをビルド中にやりますよ。つまりやりたい動作を書く。
  build:
    commands:
      - rspec HelloWorld_spec.rb

# 成果物(アプリ)について記載しますよ。
artifacts:

# 保存先ディレクトリ
  files:
# 成果物(アプリ)に関するファイル全て保存しますよ。
    - '**/*'

# 成果物の名前を次のかたちで作成しまっせ。
  name: myname-$AWS_REGION 

改良します。
Cloud9に貼り付けて作業します。
1 名前(name)は不要であるため削除

2 次のリンクを参考に、コードの加除を行う。
公式サイト:
https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/application-revisions-push.html
「rspec HelloWorld_spec.rb」を「aws deploy push」に置き換える。
つまり、プッシュします。ということ。このプッシュにはオプションを指定できるので、「 --application-name ☆☆☆」を追記する。☆は後で入れる。

3 S3のロケーションを追記する。「 --s3-location s3://バケット名/ファイル名 ソースはココにある」スラッシュ以下は実際に作成したバケットなど確認。
実際のバケット名:keiji-artifact-s3
作りたいファイル名:artifact.zip
ディレクトリ: --source src

4 「base-directory:src」を最終行に追加する。

修正結果↓↓↓

yml
# ビルドスペックのバージョンを指定
version: 0.2

# フェーズ分けしますよ。
phases:
  build:

# S3にaws deploy pushするよ。名前は☆☆☆。
    commands:
      - aws deploy push --application-name ☆☆☆ --s3-location s3://keiji-artifact-s3/artifact.zip --source src

# 成果物(アプリ)について記載しますよ。
artifacts:
# 保存先ディレクトリ  
  files:
# 成果物(アプリ)に関するファイル全て保存しますよ。  
    - '**/*'
# ここに成果物を置くことにしているよ。
 base-directory: src

IAMロールを作成します。

新規にIAMロールを作成し、CodeDeployにアタッチするロールを作成します。
image.png
image.png
image.png

Codedeployでアプリを作成していきます。

image.png
アプリケーションを作成
image.png

アプリケーション名がわかったので、Cloud9で作成中のコードに追記します。
完成です。

yml
version: 0.2
phases:
  build:
    commands:
      - aws deploy push --application-name keiji-codedeploy-app --s3-location s3://keiji-artifact-s3/artifact.zip --source src
artifacts:
  files:
    - '**/*'
 base-directory: src

デプロイグループを作成します。
オレンジのボタンから作成します。
image.png
image.png
名前は適当に、サービスロールは先程作成したものを選択
image.png
ブルーグリーンデプロイメントが選択できますね。
インプレースで進めますが、Blu/Greにすると中断を局限できそうですね!
image.png
先に作成したEC2にデプロイしますよと指定する。
image.png

CodeDeployエージェントは手作業でインストールしたので、「なし」です。
image.png
デプロイを複数台同時にデプロイする場合や、徐々にデプロイするなど、選択できるが、画像のとおり単発でデプロイする方式を選択
image.png

ロードバランサーは使用しません。
image.png
オプションを参考に貼っておきます。
アラームや、SNSの設定もできるようです。
image.png

Cloud9でymlファイルを作成する。
Cloud9にて、「src」配下に「appspec.yml」を作成します。
appspec.ymlの書き方公式資料:
https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/reference-appspec-file.html
使用するコード

yml
version: 0.0
os: linux
files:
  - source: index.html
    destination: /var/www/html/

保存を必ず行って、次のコマンド

Cloud9
git add -A
Cloud9
git commit -m "create"
 git push origin master

早速ビルドを開始していきます。
CodeDeployへ移動し、「ビルドプロジェクト」からプロジェクトにチェックを付けて、ビルドを開始します。
頭の整理w:コミット⇒プッシュ⇒ビルド⇒デプロイ
image.png

ビルドが出来ましたので、次に成果物(アプリ)をデプロイします。
image.png

プルダウンから先程作成した「web」を選択します。
image.png

リビジョンの場所は、作成したバケットを選択します。そしてzipを選択します。
image.png
補足としてデプロイの詳細を設定できるようです。参考までに。
このままデプロイのボタンをクリックします。
image.png
デプロイできたようです。
image.png
image.png
EC2に移動してブラウザにパブリックアドレスを貼り付けて、確認します。
image.png
できていますね ^^) _旦~~

ここから自動化(CI/CD)していきます。

CodePipelineで一気にデプロイしていきます。
EC2を対象として新たにパイプラインを作成します。
※今回は自動で行うので「ビルド」の項目もしっかり設定します。
注意が必要な箇所のみスクショしています。基本的には一回目の設定と同じで大丈夫です!
image.png
image.png
image.png
image.png

はい。エラーです。

結論「IAMポリシー不足」です。CodeBuildにアタッチしているポリシーがS3からのダウンロード「"s3:GetObject"」権限が必要でした。

error
CLIENT_ERROR: error while downloading key keiji-hanson-ec2-2/SourceArti/mQEbB9D, error: AccessDenied: Access Denied status code: 403, request id: 7K1N256HGBXCE8DQ, host id: MEJNzsnBF1YDUM/DV9aiYpO419hTOLRyBwjKETYZqzC0IVnXldgM3dLAgSKWhO0cdCrmW5VxiWU= for primary source and source version arn:aws:s3:::keiji-artifact-s3/keiji-hanson-ec2-2/SourceArti/mQEbB9D

翻訳:
「クライアントエラー: キー keiji-hanson-ec2-2/SourceArti/mQEbB9D のダウンロード中にエラーが発生しました。エラー: AccessDenied: アクセスが拒否されました。ステータスコード: 403, リクエストID: EWJSFC1AKTG3KH4E, ホストID: 55kpabAPc/1foAmZRR4svatG9U0EkoP8NkM63Tib/hPN6S+7cBiccEkR0462c7GTLsRaC8+ROT+N4lQVe1gU0g==。主要ソースおよびソースバージョン arn:aws:s3:::keiji-artifact-s3/keiji-hanson-ec2-2/SourceArti/mQEbB9D に対して」

やったこと。
1 コンソール内で結構深くまでエラーを確認することができました。CodeBuildの工程において、アップロードは可能だけれど、そのデータをダウンロードする工程でエラーが発生したことを認識することができました。
2 CodeBuildに権限が不足しているということで、S3へのFullAccessポリシーをアタッチしました。

※この工程で解決することができましたが、本来であれば、FullAccessではなく「"s3:GetObject"」をCodeBuildのロールにアタッチしてあげないといけませんでした。

リソースの削除

  1. Cloud9を削除します。
    赤枠からダッシュボードに戻ります。
    image.png
    ここで削除します。
    image.png
  2. EC2を終了(削除)します。
    image.png
  3. CodePipelineを削除します。
    image.png
  4. CodeCommitのリポジトリを削除します。
    image.png
  5. CodeBuildのビルドプロジェクトを削除します。
    image.png
  6. CodeDeployのアプリを削除します。
    image.png
  7. S3を削除します。
    image.png

さいごに

正直何度かやらないと、手際よくはできないと感じます。CI/CDと言えどコマンドは実行するのだなと勉強になりました。ビルドスペックファイルにテストコマンドを記載することで、アプリデプロイに係るテスト自動化など、他のサービスと組み合わせることで益々使いよくなりそうだと感じました。

では!

1
0
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
1
0