Slide 1

Slide 1 text

AWSとGitHubを使ってみよう勉強会 ~ 第4回 GitHub Actionsを使ったCD環境の構築 ~ 株式会社 豆蔵 ビジネスソリューション事業部 updated:2023/9/18

Slide 2

Slide 2 text

本日の内容 • 前回の課題の回答(35分) • 次回までの課題の説明(35分) ※「前回の課題の回答」で補足も含めているため今回は「課題の補足はなし 2 画面キャプチャやコマンド操作等はGitHubのssi- mz-studygroupユーザで行った例となります。キャ プチャやコマンド等の該当部分は自分のユーザIDに 読み替えてください ・ssi:simple server infra ・mz:mamezou

Slide 3

Slide 3 text

3 前回の課題の回答

Slide 4

Slide 4 text

前回の課題(再掲) 4 手を動かす所 課題を思い出すのも兼ね、前回の資料をもとに課題を実 施してみる

Slide 5

Slide 5 text

ワークフローの全体像 – 各論に行く前に 5 name: image-publish on: workflow_dispatch: jobs: build: runs-on: ubuntu-latest permissions: contents: read packages: write steps: - uses: actions/checkout@v3 - name: Set up JDK 17 uses: actions/setup-java@v3 with: java-version: '17' distribution: 'temurin' server-id: ghcr.io settings-path: ${{ github.workspace }} - name: Publish to GitHub Packages Apache Maven run: mvn -B package docker:build docker:push -Dimage.tag=`date +%Y%m%dT%H%M%S-%3N` --file pom.xml -s $GITHUB_WORKSPACE/settings.xml env: # 自分のリポジトリへのアクセスなのでPATではなく GITHUB_TOKENの権限で登録もできる GITHUB_TOKEN: ${{ github.token }} ※見やすいように改行しています このワークフローの目的 ✓ コンパイルしてjarを作って、 ✓ 動作させるコンテナイメージをビルドし ✓ GitHub Container Registry(ghcr.io)にpushする チェックアウト Javaのsetup Mavenコマンド実行

Slide 6

Slide 6 text

実行しているMavenコマンドの詳細 6 mvn -B → ① package → ② docker:build → ③ docker:push → ④ -Dimage.tag=`date +%Y%m%dT%H%M%S-%3N` → ⑤ --file pom.xml → ⑥ -s $GITHUB_WORKSPACE/settings.xml → ⑦ ① Mavenのバッチモードオプション(コンソールログ出力を少なめにする) ② packagフェーズの実行。これによりJavaのコンパイルとclassファイルのjarファイル化が行われ、結果が./target以下に出力される ③ dockerプラグインのbuildゴールの実行。これによりdockerプライグインの定義に従い、コンテナのビルドが行われる ④ dockerプラグインのpushゴールの実行。これによりdockerプライグインの定義に従い、コンテナレジストリへのpushが行われる ⑤ pomに定義したimage.tagプロパティの上書き指定。``(バッククオォート)によるdataコマンドがシェルで即時実行され、その結果がimage.tagプロパティに設定さ れる(例:20230726T055802-719)。 dockerプラグインではビルドしたイメージのタグ名とpushするイメージの対象に使われる ⑥ 実行するpomファイルを指定するオプション。この場合プロジェクト直下のpomが使用される(デフォルトと同じなのでこの場合は省略化) ⑦ setup-javaアクションにより生成されたghcr.ioへの接続情報が設定されたsettings.xmlを指定する

Slide 7

Slide 7 text

Mavenコマンドの実行の流れ – 1/2 7 $ mvn package target ├─hello-app.jar ├─libs │ ├─aopalliance-repackaged-3.0.3.jar │ ├─helidon-common-3.2.1.jar │ ├─helidon-common-configurable-3.2.1.jar │ ... $ mvn docker:build io.fabric8 docker-maven-plugin 0.40.2 ghcr.io ssi-mz-studygroup/hello-app ${image.tag} ${project.basedir} try # ベースイメージはeclipse-temurin(旧OpenJDK)のJava17を使用 FROM docker.io/eclipse-temurin:17-jre-alpine # 作業ディレクトリを/(root)にする WORKDIR / # Mavenのビルド成果物(sample-app.jar)をコンテナイメージにCOPY COPY ./target/hello-app.jar ./ # Mavenのビルド成果物(libs以下を)をコンテナイメージにCOPY COPY ./target/libs ./libs # ExecutableJarをjavaコマンドで起動 CMD ["java", "-jar", "./hello-app.jar"] ビルド成果物をイメージにCOPY ./Dockerfile dockerプラグインの設定 contextDir直下(プロジェクト直下)のDockerfileを使ってイメージをビルドする buildした イメージを 登録 nameタグの値をイメージ名しタグにtagタグに設定されている値を付ける

Slide 8

Slide 8 text

Mavenコマンドの実行の流れ – 2/2 8 $ mvn docker:push io.fabric8 docker-maven-plugin 0.40.2 ghcr.io ssi-mz-studygroup/hello-app ${image.tag} ${project.basedir} try dockerプラグインの設定 [nameタグ]:[tagタグ]がpush対象 pushする先 イメージを push ghcr.io ${env.GITHUB_ACTOR} ${env.GITHUB_TOKEN} dockerプラグインの設定 setup-javaアクションで生成されたsettings.xml ghcr.ioに対する認 証を情報を参照 ✓ ${env.ENV_VAL}はENV_VALの環境変数を参照する設定 ✓ GITHUB_ACTORとGITHUB_TOKENはGitHubActionにより環境変数に設定される ✓ GITHUB_TOKENはそのワークフロー限り有効なアクセストークン

Slide 9

Slide 9 text

GitHub Actions中のコンテナ操作 • dockerプラグインが行っている操作はコマンドレベルでは以下と同じになる • 今回はDockerコマンドの実行をプラグインで行ってくれるdockerプラグインを使ったが、 run: で直接dockerコマンドを実行する形式でも同じことができる(通称:ランラン♪して実 行するパターン) • ただし、run:でdockerコマンドを実行する場合はghcr.ioへの認証(docker login) が必要となるため、そのIDとパスワードの管理が必要となる。どこに保存してどうやって 参照するかは少し工夫が必要 9 # タグの値を取得 IMAGE_TAG=`date +%Y%m%dT%H%M%S-%3N` # ./Dockerfileを使ってコンテナイメージをビルド docker build -t ssi-mz-studygroup/hello-app:${IMAGE_TAG} . # ghcr.ioへpushするためにコンテナ名にprefixを付ける docker tag ssi-mz-studygroup/hello-app:${IMAGE_TAG} ghcr.io/ssi-mz-studygroup/hello-app:${IMAGE_TAG} # ghcr.ioへのpushの実行 docker push ghcr.io/ssi-mz-studygroup/hello-app:${IMAGE_TAG}

Slide 10

Slide 10 text

参考情報 • 今さら聞けないMaven – コンテナも一緒にビルドしたい。テスト実行前にコンテナを起動したい | 豆蔵デ ベロッパーサイト • https://developer.mamezou-tech.com/blogs/2022/08/31/docker_with_maven/ • 「テスト実行前にコンテナを起動したい」の章は関係なし • GitHub Packages Container Registryをモデリングしてみた – UMLを理解の道具として | 豆蔵デ ベロッパーサイト • https://developer.mamezou-tech.com/blogs/2023/03/09/ghcr-modeling/ • 今さら聞けないMaven – コンテナのビルドと一緒にpushもMavenでしたい。 | 豆蔵デベロッパーサイト • https://developer.mamezou-tech.com/blogs/2023/03/02/docker-push-with-maven/

Slide 11

Slide 11 text

11 次回までの課題の説明 キャプチャを取得するために利用したAWSリソースは すべて削除しています。 説明では上記対策を行った上で例を分かりやすくす るため一部セキュリティ情報含んだ画面キャプチャを 使用しています。本来は好ましくないためその点はご 留意ください。

Slide 12

Slide 12 text

次回までの課題 • テーマ • GitHub Packgesで公開したコンテナイメージをAWSのEC2で動かす • お題 • AWSアカウントを作成する(まだない人) • EC2インスタンスを作成する • SSHでEC2に接続する • EC2環境を構築する(Dockerエンジンのインストールなど) • GitHub Packageで公開したコンテナイメージを起動する • ゴール • AWS上のコンテナアプリをローカルから呼び出せること 12

Slide 13

Slide 13 text

課題の実施手順 Step1. AWSアカウントを作成する(まだない人) Step2. EC2インスタンスを作成する Step3. SSHでEC2に接続する Step4. EC2環境を構築する(Dockerエンジンのインストールなど) Step5. GitHub Packageで公開したコンテナイメージを起動する Step6. AWS上のコンテナアプリをローカルから呼び出す 13

Slide 14

Slide 14 text

演習アドバイス • 困ったことがあったら • 今回の演習対象のAWSのアカウント作成とEC2に関することはネットに沢山あります • 困ったな?これなんだ?と疑問に思ったことはグーグル先生かChat GPTに聞くと大抵答えを教えてくれます • ただし、検索結果の上位にAWSのドキュメントが掛かりますが、これを最初に見るのは避けましょう • 対象を分かっている状態でマニュアル的に参照するに分にはよいですが「どうやればいいのだろ?」な状態でAWSのドキュメントをみると 余計?が増えます。まずはクラスメソッドさんのブログやQiitaなど平易に書かれてそうな記事を見るのがお勧めです • 演習手順でこれは気をつけましょう(先に言っておきます) • ルートユーザとは別にIAMユーザを作成し、普段の作業はIAMユーザで行うようにする • ルートユーザもIAMユーザも認証はMFAを有効化する、絶対 • EC2のソフトウェアイメージ(AIM)はAmazon Linux 2023 AIMではなく Amazon Linux 2 AMI(HVM)を使う • EC2のインスタンスタイプはt2.microを使う • EC2は使い終わったら課金がもったいないので停止する • なお「インスタンスの終了」はインスタンスの削除なので間違いないこと。停止は「インスタンスの停止」 14

Slide 15

Slide 15 text

Step1. AWSアカウントを作成する(まだない人)- ルートアカウントの作成 • AWSのアカウントを作成する • ここはキャプチャを採れないので「AWSアカウント 作成」で検索すると情報が沢山でるのでネットの 情報を見ながら作成 • ルートアカウントの作成だけは以下のAmazonの公式が分かりやすい https://aws.amazon.com/jp/register-flow/ • アカウントを作成したら必ずMFA認証を有効化すること • MFA認証の有効化はIAMユーザと同じなので、21-22スライドを参考にする 15

Slide 16

Slide 16 text

Step1. AWSアカウントを作成する(まだない人)- IAMユーザの作成(1/8) • 通常操作を行うIAMユーザを作成する • ルートユーザは権限が最強なので通常作業を行うIAMユーザを作成する • IAMユーザの権限はみんなで使う環境ではないのでAdministratorグループでOK • こちらのユーザも必ずMFA認証を有効化すること ■ ルートユーザでログインしている状態で開始! ①IAMを入力して検索 ②クリック

Slide 17

Slide 17 text

Step1. AWSアカウントを作成する(まだない人)- IAMユーザの作成(2/8) ①ユーザメニューをクリック ②クリック 17

Slide 18

Slide 18 text

Step1. AWSアカウントを作成する(まだない人)- IAMユーザの作成(3/8) 18 ①任意のユーザ名を入力 ②必ずこちらを選択 デフォルトのままでもOKだが、 お好みで変更してもOK ③入力が完了したらクリック

Slide 19

Slide 19 text

Step1. AWSアカウントを作成する(まだない人)- IAMユーザの作成(4/8) 19 ①デフォルトのこちらになっていることを確認 ②チェックを付ける ③入力が完了したらクリック 「グループの作成」でAdministratorAccessポリシーをアタッチした Administratorsグループを作成してからの手順となります。 グループの作成手順は https://zaitakufrog-blog.com/iam-administrator/#toc9 の①~③の手順と同じになります

Slide 20

Slide 20 text

Step1. AWSアカウントを作成する(まだない人)- IAMユーザの作成(5/8) 20 ①内容を確認してクリック この画面までこれたら登録は完了! ②クリックして一覧へ この数字12桁の部分が登録したユーザ のユーザIDとなる 下線部の3つは後でロ グインするときに使うの で忘れずに控えておく こと *******

Slide 21

Slide 21 text

Step1. AWSアカウントを作成する(まだない人)- IAMユーザの作成(6/8) 21 ①登録したユーザをクリック ■ MFAの有効化 ②ここをクリック ③ダイアログが出てくるので有 効化をクリック *******

Slide 22

Slide 22 text

Step1. AWSアカウントを作成する(まだない人)- IAMユーザの作成(7/8) 22 ①デバイスを識別する任意の名称を入力 ②こちらになってることを確認 (デフォルトのまま) ③クリック ④スマフォのAuthenticator アプリで このQRコードを読み取る ⑤QRコードを読み取ったアプリで 表示されているワンタイムパスワー ドを入力する ⑥MFAコード1で入力したパスワードの次に表示されたパ スワードを入力する ⑦クリック *** ***

Slide 23

Slide 23 text

Step1. AWSアカウントを作成する(まだない人)- IAMユーザの作成(8/8) ①MFAが有効化されてるのを確認できたらすべ て完了🙌 ②サインアウトして登録したIAMユー ザでログインしなおす 23 *******

Slide 24

Slide 24 text

Step2. EC2インスタンスを作成する(1/9) ■ 先ほど登録したIAMユーザでログインする 24 ②ユーザ登録時に控えた数字 12桁のユーザIDを入力 ①IAMユーザを選択 ③入力したクリックして次へ ④ユーザ登録時に控えたそれぞれの内容 を入力したらクリックして次へ ⑤スマフォのワンタイムパスワードを 入力してクリック ※このユーザは既に削除しています ******* ***

Slide 25

Slide 25 text

Step2. EC2インスタンスを作成する(2/9) ■ ログイン後の確認とEC2画面へ ②東京はコレ ①リージョンが東京になっているか確認なって いない場合は東京を選択 初めから東京が選択されている場合もある。 その場合はそれでOK EC2を入力して検索 ③クリック 25

Slide 26

Slide 26 text

Step2. EC2インスタンスを作成する(3/9) ■ インスタンスの作成 ①ダッシュボードをクリック ②インスタの起動をクリック

Slide 27

Slide 27 text

Step2. EC2インスタンスを作成する(4/9) ①任意のインスタンス名を入力 ②Amazon Linuxを選択(デフォルト) ③Amazon Linux 2 AMI(HVM)を必ず選択 ④デフォルトのt2.microでOK ⑤クリックして作成へ ⑥任意のキー名を入力 ⑦あとはデフォルトのままで 作成をクリック ⑧ダウンロードダイアログがでるのでロー カルの任意の場所に保存 ***

Slide 28

Slide 28 text

Step2. EC2インスタンスを作成する(5/9) ①すべての入力が完了したらここをクリック。なお、 前スライドで特に指示のない項目はデフォルトの ままでよい ②インスタンスの作成は完了 したので、クリックして一覧へ もどる

Slide 29

Slide 29 text

Step2. EC2インスタンスを作成する(6/9) ■ セキュリティグループの設定(7001ポート開ける) ※この手順はデモではやらなかったものになります。 やらなかった理由は単に忘れてましたmm ①作成したインスタンスのリン クをクリックして詳細画面へ 29

Slide 30

Slide 30 text

Step2. EC2インスタンスを作成する(7/9) 30 ①起動したEC2インスタンスに割り当てら れたパブリックIPアドレス ローカルからcurlでREST APIを呼ぶ 時に使用するため控えておく ②セキュリティタブをクリック ③クリックしてセキュリティグ ループの変更へ ************

Slide 31

Slide 31 text

Step2. EC2インスタンスを作成する(8/9) ②クリック ③クリックして行を追加 ④クリックで追加された行を 編集 カスタムTCP, 7001, Anywhere IPv4になるように入力&選択 ①クリック ⑤行の追加ができたらクリックして保存

Slide 32

Slide 32 text

Step2. EC2インスタンスを作成する(9/9) ■ SSHクライアントの接続方法の確認 ①確認するインスタン スにチェック 32 (一覧に戻って行う) 下線部は後で実施するSSHクラ イアントからの接続で使うコマンド なので控えておく ③確認が終わったらク リックして元の画面へ 戻る これでEC2インスタン スの作成は完了です ②インスタンスにチェックしたら クリック

Slide 33

Slide 33 text

Step3. SSHでEC2に接続する(1/1) ■ ローカルのSSHクライアントからEC2に接続する (Windowsは標準でSSHクライアントは入っていないため、ネットなどで調べて各自で好きなものをインストールしてくだ さい) • SSHクライアントを起動しpemファイルを保存したディレクトリに移動する • AWSコンソールの「接続」画面で確認した下線部のコマンドを実行する • 2つ目のSSHコマンドの引数は個人ごとに異なります これがでれば接続OK • EC2インスタンスに割り当てられるパブリックIPアドレスは EC2の起動ごとに変わる • なので、EC2を再起動した場合はAWSコンソールの前 スライドの「接続」で再度接続に必要なコマンドを確認し、 それを利用すること

Slide 34

Slide 34 text

Step4. EC2環境を構築する (1/4) ■タイムゾーンとロケールの設定 • コマンドはhttps://github.com/mamezou-tech/try-aws-github-learningに記載しているのでそちらからコピー して実行してください。このキャプチャは実行イメージと結果の確認目的となります(以降のスライドも同じです) タイムゾーンがAsia/Tokyoになっていること 結果が左記のとおりになっていること

Slide 35

Slide 35 text

Step4. EC2環境を構築する (2/4) ■Dockerのインストール • パッケージの最新化 ←最後にComplete!が出力されればOK

Slide 36

Slide 36 text

Step4. EC2環境を構築する (3/4) ■Dockerのインストール • Dockerエンジンのインストール ←最後にComplete!が出力されればOK ←最後にComplete!が出力されればOK

Slide 37

Slide 37 text

Step4. EC2環境を構築する (4/4) ■Dockerのインストール • Dockerの開始 ←active(runnningになっていればOK) • Dockerの自動起動の設定 ↑ CreatedがでればOK 37

Slide 38

Slide 38 text

Step5. GitHub Packageで公開したコンテナイメージを起動する ■コンテナの起動 • Docker runでコンテナを起動 ←最後にコンテナID(乱数)が出力されればOK • ログから起動を確認 38 ↑ StartedのログがでればOK ※:ssi-mz-studygroupの部分はご自身のGitHubのIDになります 38

Slide 39

Slide 39 text

Step6. AWS上のコンテナアプリをローカルから呼び出す ■別のコントールを立ち上げてローカル環境からAWS上のREST APIを呼び出す • 接続IPアドレスは個人ごとに異なります • 接続IPアドレスはEC2インスタンスのIPアドレスで、EC2インスタンスを作成したときに確認して控えてお いたアドレスになります。 ↑ Helloが返ってくれば成功です! 今回の課題はこれで終了です。お疲れさまでしたmm 39 • EC2インスタンスに割り当てられるパブリックIPアドレスは EC2の起動ごとに変わる • なので、EC2を再起動した場合はAWSコンソールから 再度パブリックIPアドレスを確認すること(IPアドレスの確 認方法は30スライドを参照)

Slide 40

Slide 40 text

40 次回の予定

Slide 41

Slide 41 text

次回の予定 • 今回の課題の説明 • 補足説明と質疑応答 • 次回までの課題の説明 • コンテナイメージを今度はサーバーレスのECS Fargateを使って動かす! (ついに完結!) 41