|
1 |
| -# iac-story-code |
| 1 | +# クラウドネイティブIaCストーリー/サンプルコード |
| 2 | + |
| 3 | +## Overview |
| 4 | + |
| 5 | +本リポジトリでは「比べてわかる!IaCの選び方 ~クラウドネイティブIaCストーリー」の付録である各IaCのサンプルソースコードを提供しています。 |
| 6 | +また、Cloud9上でサンプルコードを動作させる手順も併せて記載していますので、AWSアカウントをお持ちの方はぜひハンズオン感覚でお試しください。 |
| 7 | + |
| 8 | +## サンプルコードの種類 |
| 9 | + |
| 10 | +|IaCサービス|言語/フォーマット|対象ディレクトリ| |
| 11 | +|-|-|-| |
| 12 | +|CloudFormation|YAML|[cloudformation](./cloudformation)| |
| 13 | +|CDK|TypeScript|[cdk-typescript](./cdk-typescript)| |
| 14 | +|Terraform|HCL|[terraform](./terraform)| |
| 15 | +|Pulumi|Go|[pulumi-go](./pulumi-go)| |
| 16 | + |
| 17 | +## サンプルコードの動作環境・バージョン情報 |
| 18 | + |
| 19 | +- CloudFormation: 2021年6月時点にAWS マネジメントコンソールから提供されるサービスバージョン |
| 20 | + - Template version: 2010-09-09 |
| 21 | + |
| 22 | +- AWS CDK: 1.106.1 (build c832c1b) |
| 23 | + - Node.js: v14.15.1 |
| 24 | + |
| 25 | +- Terraform: v1.0 |
| 26 | + - tfenv: v2.2.2 |
| 27 | + - AWS Provider: 3.45.0 |
| 28 | + - Terragrant: v0.30.3 |
| 29 | + |
| 30 | +- Pulumi: v3.4.0 |
| 31 | + - AWS Provider: v4.7.0 |
| 32 | + - Go: 1.16.5 |
| 33 | + |
| 34 | + |
| 35 | +## 構築可能なAWS環境 |
| 36 | + |
| 37 | +いずれのIaCサービスサンプルコードを実行しても以下のAWSサービスが構築されます。 |
| 38 | + |
| 39 | + |
| 40 | + |
| 41 | +### 作成されるAWSサービス群 |
| 42 | + |
| 43 | +- Amazon VPC |
| 44 | + - Subnet (パブリック - AZ x 2) |
| 45 | + - Subnet (プライベートApp用 - AZ x 2) |
| 46 | + - Subnet (プライベートVPC Endpoint用 - AZ x 2) |
| 47 | + - Route Table (内部通信用) |
| 48 | + - VPC Endpoint(S3, CloudWatch Logs, ECR) |
| 49 | + - Security Group(ALB用) |
| 50 | + - Security Group(App用) |
| 51 | + - Security Group(VPC Endpoint用) |
| 52 | + - Internet Gateway |
| 53 | +- Elastic Load Balancing |
| 54 | + - ALBリスナー |
| 55 | + - ターゲットグループ |
| 56 | +- AWS IAM |
| 57 | + - Role (ECSタスク実行用) |
| 58 | + - Policy (ECSタスク実行用) |
| 59 | +- AWS Systems Manager パラメータストア |
| 60 | +- Amazon ECS |
| 61 | + - Cluster |
| 62 | + - Service |
| 63 | + - Task定義 |
| 64 | +- Amazon ECR リポジトリ |
| 65 | +- Amazon CloudWatch Log Group |
| 66 | + |
| 67 | +## ハンズオン実施に向けて |
| 68 | +ここでは、本リポジトリで提供するIaCサービスをハンズオンとして実施するための準備事項を記載します。 |
| 69 | + |
| 70 | +### 前提事項 |
| 71 | +- AWSアカウントを所有していること |
| 72 | +- AdministratorAccessポリシー相当のIAMユーザもしくはIAMロールで作業可能なこと |
| 73 | + |
| 74 | +### 事前準備 |
| 75 | + |
| 76 | +IaCサービスの実行はAWS Cloud9上で行います。 |
| 77 | +ここではCloud9の作成と関連するセットアップ手順を記載します。 |
| 78 | + |
| 79 | +#### Amazon Cloud9の作成 |
| 80 | + |
| 81 | +各IaCサンプルコードを実行するためにCloud9を利用します。 |
| 82 | +デフォルトで各種言語のランタイムやDocker CLIが利用できるなど、メリットがあります。 |
| 83 | +早速、Cloud9用のインスタンスから作成します。 |
| 84 | + |
| 85 | +1. AWSマネジメントコンソール上部の [サービス] タブより [Cloud9] を選択します。 |
| 86 | +2. Cloud9ダッシュボードの左側ナビゲーションメニューから [Account environments] を選択し、[Create environment] ボタンを押します。 |
| 87 | +3. [Step1 Name environment] では、次のように各項目を入力後、 [Next step] ボタンを押します。 |
| 88 | + |
| 89 | +|項目名|値| |
| 90 | +|-|-| |
| 91 | +|Name|cnis-playground| |
| 92 | +|Description|(入力なし)| |
| 93 | + |
| 94 | +4. [Step2 Configure settings] では、次のように各項目を入力・選択後、 [Next step] ボタンを押します。 |
| 95 | +ネットワークVPC及びサブネットはデフォルトのものを選択してください(デフォルトVPCが存在しない場合、インターネットに接続可能なVPCとサブネットを選択してください)。 |
| 96 | + |
| 97 | +|項目名|値| |
| 98 | +|-|-| |
| 99 | +|Environment type|Create a new EC2 instance for environment(direct access)| |
| 100 | +|Instance type|t3.micro(2 GiB RAM + 1 vCPU)| |
| 101 | +|Platform|Amazon Linux2 (recommended)| |
| 102 | +|Cost-saving setting|After 30 minutes(default)| |
| 103 | +|Network(VPC)|vpc-xxxxxxx(default) ※インターネットに接続可能なVPC| |
| 104 | +|Subnet|subnet-xxxxxxx | Default in ap-northeast-1a| |
| 105 | + |
| 106 | +5. [Review] にて入力内容を確認し、 [Create environment] ボタンを押します。 |
| 107 | + |
| 108 | +<img src="./images/cloud9-confirm.png"> |
| 109 | + |
| 110 | +6. 以下のようにCloud9コンソールが利用可能であることを確認してください。 |
| 111 | + |
| 112 | +<img src="./images/cloud9-main.png"> |
| 113 | + |
| 114 | +#### IAMユーザーの作成 |
| 115 | + |
| 116 | +Cloud9ではマネジメントコンソールにログインしたIAMユーザーの権限で自動的に認証権限が設定される仕組みを持っています。 |
| 117 | +これは AWS Managed Temporary Credentials(以降「AMTC」と略します) と呼ばれています。 |
| 118 | + |
| 119 | +[AWS Managed Temporary Credentials](https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/how-cloud9-with-iam.html#auth-and-access-control-temporary-managed-credentials) |
| 120 | + |
| 121 | +IAMロール等の付与等も不要であるため便利なのですが、以下のような制約があります。 |
| 122 | + |
| 123 | +[Actions Supported by AWS Managed Temporary Credentials](https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/how-cloud9-with-iam.html#auth-and-access-control-temporary-managed-credentials-supported) |
| 124 | + |
| 125 | +今回は上記制約を回避するため、AMTCは無効化とし、別な権限からAWSCLIを実行できるようにします。 |
| 126 | +TerraformやPulumiではIAMユーザーアカウントから生成されるアクセスキーIDとシークレットアクセスキーが環境変数として設定されることを期待して動作します。 |
| 127 | +そのため、インスタンスプロファイルによるIAMロール付与ではなく、アクセスキーIDの設定を行います。 |
| 128 | + |
| 129 | +1. AWSマネジメントコンソールのトップ画面上部の [サービス] タブより [IAM] を 選択。 |
| 130 | +2. IAMダッシュボードの左側ナビゲーションメニューから [ユーザー] を選択し、表示画面上部の [ユーザーを追加] ボタンを押下。 |
| 131 | +3. ユーザーを追加画面にて次表の項目を選択後、[次のステップ:アクセス権限] ボタンを 押下。 |
| 132 | + |
| 133 | +|項目名|値| |
| 134 | +|-|-| |
| 135 | +|ユーザー名|cnis-user| |
| 136 | +|アクセスの種類|プログラムによるアクセス| |
| 137 | + |
| 138 | +4. ユーザーを作成画面にて、[既存のポリシーを直接アタッチ]を選択し、[AdministratorAccess] にチェックを入れた後、[次ののステップ:タグ] ボタンを押下。 |
| 139 | +5. ここではタグの追加はスキップ。[次のステップ:確認] ボタンを押下。 |
| 140 | +6. 確認画面にて、確認画面に表示された内容を確認し、[ユーザーの作成] ボタンを押下。 |
| 141 | +7. 成功の旨を確認し、表示されるアクセスキーIDとシークレットアクセスキーの値を控えておく。 |
| 142 | + |
| 143 | +#### AWSアクセスキーの設定 |
| 144 | + |
| 145 | +1. AWS マネジメントコンソールのトップ 画面上部の [サービス] タブより [Cloud9] を選択。 |
| 146 | +2. Cloud9 ダッシュボードの左側ナビゲーションメニューから [Your environments] を選択し、表示画面中央の cnapp-playground 内 [Open IDE] ボタンを押下。コンソールが表示されるまで待つ。 |
| 147 | + |
| 148 | +3. コンソール上で`~/.aws/credentials`を作成し、以下のように入力して保存。 |
| 149 | +``` |
| 150 | +[default] |
| 151 | +aws_access_key_id=****** |
| 152 | +aws_secret_access_key=****** |
| 153 | +``` |
| 154 | + |
| 155 | +`aws_access_key_id`と`aws_secret_access_key`は、先程IAMユーザー作成時に払い出して作成したアクセスキーIDとシークレットアクセスキーを入力する。 |
| 156 | + |
| 157 | +4. コンソール上で`~/.aws/config`を作成し、以下のように入力して保存。 |
| 158 | +``` |
| 159 | +[profile default] |
| 160 | +region = ap-northeast-1 |
| 161 | +``` |
| 162 | + |
| 163 | +以上でAWSアクセスキーの設定は完了です。 |
| 164 | +実際には、AWSアクセスキーをそのままフラットファイルに記載してしまうのは危険なので、[aws-vault](https://github.com/99designs/aws-vault)等と組み合わせて利用するのが実運用を考えると現実的です。 |
| 165 | +今回のハンズオンは簡略化のため、credentialsに記載しています。 |
| 166 | + |
| 167 | +#### AMTCの無効化 |
| 168 | + |
| 169 | +発行したAWSアクセスキーを利用するため、AMTCを無効化します。 |
| 170 | + |
| 171 | +1. AWS マネジメントコンソールのトップ 画面上部の [サービス] タブより [Cloud9] を選択。 |
| 172 | +2. Cloud9 ダッシュボードの左側ナビゲーションメニューから [Your environments] を選択し、表示画面中央の cnapp-playground 内 [Open IDE] ボタンを押下。コンソールが表示されるまで待つ。 |
| 173 | +3. 画面中央上部のタブの [+] ボタンを押し、[Open Preferences] を選択して新規タブを作成。タブ画面内の左側ナビゲーションメニューから [AWS Settings] → [Credentials] を選択。 |
| 174 | +4. 表示される画面上の [AWS managed temporary credentials:] を OFFに設定。 |
| 175 | + |
| 176 | +<img src="./images/cloud9-amtc-off.png"> |
| 177 | + |
| 178 | +5. 以下のコマンドで作成した`cnis-user`の情報が返却できれば、AMTCではなくアクセスキーID経由でAWSCLIが実行できる状態。 |
| 179 | + |
| 180 | +```bash |
| 181 | +$ aws iam list-users |
| 182 | +{ |
| 183 | + "Users": [ |
| 184 | + { |
| 185 | + "UserName": "cnis-user", |
| 186 | + "Path": "/", |
| 187 | + : |
| 188 | + }, |
| 189 | + : |
| 190 | +} |
| 191 | +``` |
| 192 | +
|
| 193 | +以上により、Cloud9環境が整いました。 |
| 194 | +
|
| 195 | +#### EBSボリュームサイズの変更 |
| 196 | +
|
| 197 | +IaCによってはプロバイダーのダウンロードを行います。 |
| 198 | +Cloud9のデフォルトボリュームだとサイズが足りないので、別途EBSをアタッチします。 |
| 199 | +
|
| 200 | +1. AWS マネジメントコンソールのトップ 画面上部の [サービス] タブより [EC2] を選択。 |
| 201 | +2. EC2ダッシュボードの左側ナビゲーションメニューから [インスタンス] を選択。 |
| 202 | +3. インスタンス一覧画面から Name 列で [aws-cloud9-cnis-playground-] のインスタンスを選択し、画面下部の [ストレージ] を選択。 |
| 203 | +4. [vol-**] から始まるボリュームIDを控えておく。 |
| 204 | +5. EC2ダッシュボードの左側ナビゲーションメニューから [ボリューム] を選択。 |
| 205 | +6. 手順4.で選択したボリュームID選択し、画面上部の [アクション] → [ボリュームの変更] を選択。 |
| 206 | +7. ボリュームの変更画面上の [サイズ] を10 → 30 に変更した後、[変更] ボタンを押下。 |
| 207 | +8. ボリュームを変更してもよいか確認する旨が表示されるので [はい] を選択。 |
| 208 | +9. ボリュームの変更リクエストが成功しました、と表示されることを確認して[閉じる] ボタンを押し、ボリューム一覧画面の右上の更新ボタンを押してサイズが変更されることを確認。 |
| 209 | +
|
| 210 | +以上でEBSボリュームサイズの変更作業は完了です。 |
| 211 | +ディスクサイズ拡張を確実に反映させるため、インスタンスを再起動させておきましょう。 |
| 212 | +
|
| 213 | +
|
| 214 | +#### 各種ツールのインストール |
| 215 | +
|
| 216 | +再びCloud9コンソールに戻り、以下をインストールしておきます。 |
| 217 | +``` |
| 218 | +$ sudo yum -y install tree jq |
| 219 | +``` |
| 220 | +
|
| 221 | +### リポジトリの取得 |
| 222 | +
|
| 223 | +Cloud9上で実行する本リポジトリを取得します。 |
| 224 | +
|
| 225 | +1. Cloud9 IDEを開き、画面下部のコマンドラインにて以下を入力。 |
| 226 | +
|
| 227 | +``` |
| 228 | +$ git clone https://github.com/uma-arai/iac-story-code |
| 229 | +Cloning into 'iac-story-code'... |
| 230 | +: |
| 231 | +Resolving deltas: 100% (172/172), done. |
| 232 | +``` |
| 233 | +
|
| 234 | +2. リポジトリがクローンされていることを確認。 |
| 235 | +``` |
| 236 | +$ cd iac-story-code/ |
| 237 | +$ tree . |
| 238 | +``` |
| 239 | +
|
| 240 | +これで各サンプルコードを実行する準備が出来ました。 |
| 241 | +
|
| 242 | +## 各IaCサービスのハンズオン |
| 243 | +
|
| 244 | +本リポジトリの各IaCサービスディレクトリ配下の`README.md`に従って実施してください。 |
| 245 | +
|
| 246 | +## 注意事項 |
| 247 | +
|
| 248 | +- 本リポジトリは不定期にバージョンアップを行います。READMEのバージョン情報を適宜ご参照ください。 |
| 249 | +- IaCサービス利用により、以下のAWSサービスが作成されます。料金が発生するサービスも含まれており、各IaCサービス用 README.md に従ってリソースの削除をオススメします。 |
| 250 | + - リソースを作成したまま1ヶ月放置すると、東京リージョン(ap-northeast-1)で**約¥13,000程度請求されてしまう**ので、消し忘れにご注意ください($1=¥110換算、消費税なし)。 |
| 251 | +
|
| 252 | +
|
| 253 | +## 免責事項 |
| 254 | +
|
| 255 | +- 本リポジトリ(以降、`iac-story-code`)は利用者ご自身の判断と責任において行われるものとします。 |
| 256 | +
|
| 257 | +- `iac-story-code`の各種情報等については、慎重に作成、管理し、正確性を保つようには努めていますが、万一記載情報が事実と異なる場合は、Issueを作成していただけると幸いです。 |
| 258 | +
|
| 259 | +- `iac-story-code`の内容の全部または一部を事前の告知なしに変更する場合があります。 |
| 260 | +
|
| 261 | +- `iac-story-code`上から入手された情報により発生したあらゆる損害に関して一切の責任を負いません。 ここに掲載する情報およびリンクが設定されている他のサイトから取得された各種情報の利用によって生じたあらゆる損害に関しても一切の責任を負いません。 |
| 262 | +
|
| 263 | +- `iac-story-code`にに登場するシステム名や製品名は、関係各社の商標または登録商標です。また本書では、™、®、©などのマークは省略しています。 |
0 commit comments