Exam Readiness DOP : 分野 1: SDLC の自動化

# はじめに
AWS DOPの試験対策で[Exam Readiness: AWS Certified DevOps Engineer – Professional (Japanese)](https://explore.skillbuilder.aws/learn/course/117/play/503/exam-readiness-aws-certified-devops-engineer-professional-japanese)を視聴したので、内容をまとめます。

# アジェンダ
| 分野 | 内容 |
|------|---------|
|    1  |   SDLC の自動化|
|    2  |   [設定管理とIaC](https://qiita.com/tetsuya_tech/items/1691599cebc9ebafa730)|
|    3  |  [モニタリングとロギング](https://qiita.com/tetsuya_tech/items/338385fe2cdf2265a543)|
|    4  |  [ポリシーと標準の自動化](https://qiita.com/tetsuya_tech/items/baa999857d805fae3842)|
|    5  |   [インシデントとイベントレスポンス](https://qiita.com/tetsuya_tech/items/24315754f4af20743423)|
|    6  | [高可用性、対障害性、災害復旧](https://qiita.com/tetsuya_tech/items/317bb98700b7b59026c7)|


# CI/CDパイプラインの自動化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951272/d4cdbb47-0f54-ba1b-d36a-3a4dd5397cd8.png)

## 継続的インテグレーション
1. コードのチェックイン時にリリースを自動化
1. 整合性と再現性のある環境デコードをビルド、テスト
1. アーティファクトを継続的にデプロイ
1. ビルド失敗時にフィードバックループを閉じる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951272/7672341e-c420-decd-ceb4-7e514bb0328c.png)


## 継続的デプロイ
1. ステージング環境に変更を自動的にデプロイ
1. 本番環境に安全にデプロイ
1. 迅速に配信し、デプロイ頻度を高め、失敗率を低下

## AWSのコードサービス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951272/12864d71-bf78-4f57-7c70-49008f477101.png)

### CodeCommit
- リポジトリを提供
- IAMと統合可能。
- Code Buildを開始する場合にはCloudWatchイベントに通知をする。
- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951272/afdba5e4-1a53-72d0-ca36-c76948e7f607.png)


### CodeBuild
- CodeCommit、S3、BitBascket、GitHubかららソースをビルド
- CodeBuikd Agentを利用してローカルにデバッグ可能
- buildspec.yamlにビルド仕様を記載可能
- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951272/0685a424-0185-2a7c-341d-3f6f03397a92.png)



### Code Deploy
- 任意のインスタンスへのデプロイを自動化
- インスタンスにデプロイエージェントをインストールする
- CodeBuildでコードをビルドするとデプロイが可能
-  AppSpecファイルでデプロイの各フェーズのコマンドを指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951272/498003b2-2061-95df-0dab-52faf4a4b7e7.png)

### Code Pipeline
- コードが変更されるたびにビルド、テスト、デプロイを実行する
- Lambdaでも制御可能だが、コードの記載が必要で複雑になる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951272/7fb264cd-4ff9-f96d-a401-98f7e8b7895e.png)
- 手動承認にも対応
- サードパーティのツールにも対応
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951272/72cd527b-b8fe-e6c4-d19e-209c8ea2a28f.png)

# テストの自動化
- インフラに対してもテストが必要
- TDD（テスト駆動型開発）：コードを記述する前にテストを記述することでコード変更時にテストが可能。単体テストで品質を保証する
-対障害性テスト：コンポーネントをダウンさせて挙動を確認する

# デプロイ・デリバリー戦略
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951272/25b67010-8915-0b2f-a972-7a914dd046d0.png)

# 問題例
- セキュリティ認証情報がCodeCommitにコミットされたくない
-> git-secretをpre-commitフックとして設定し、セキュリティ認証情報が検知された場合、コミットの作成をブロックする
- Codebuildに承認されたユーザのみがアクセス。生成されるビルドアーティファクトは安全に保存
-> 承認するユーザにIAMポリシーがアタッチされたロールを提供。デフォルトで暗号化が有効なS3にビルドアーティファクトをプッシュ
- Jenkinsが高額なので、ビルド環境のフットプリントを減らしたい。
-> JenkinsにEC2インスタンスのプラグインをインストールし、ビルドのリクエストに応じて自動で起動、終了する。
- CodeStarのデプロイステージでLambda関数のリソース名を変更したい。
-> CodeCommitリポジトリでtemplate.tmlファイルでLambdaリソース名を変更する。
- ECRにログインしてプレビルドステージでリポジトリURIを設定するために、buildspec.ymlを設定
-> ビルドステージでdocker build -t $REPOSITORY_URI:latest、ポストビルドステージでECRリポジトリにイメージをdocke push $REPOSITORY_URI:latestでプッシュする