Skip to content

Commit c210239

Browse files
committed
Add command
1 parent 01ef406 commit c210239

2 files changed

Lines changed: 355 additions & 0 deletions

File tree

command/11/README.md

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
# 第11章
2+
3+
## プライベートリポジトリの作成
4+
5+
```shell
6+
gh repo create gh-oidc --private --clone --add-readme
7+
cd gh-oidc
8+
```
9+
10+
11+
## AWSにおけるOpenID Connectの利用準備
12+
13+
ココから先はAWS CloudShellでの作業です。
14+
15+
### AWS CLIのバージョン確認
16+
17+
```shell
18+
aws --version
19+
```
20+
21+
### AWSアカウントIDの取得
22+
23+
```shell
24+
aws sts get-caller-identity --query Account --output text
25+
```
26+
27+
## OpenID Connect Provider
28+
29+
```shell
30+
aws iam create-open-id-connect-provider \
31+
--url https://token.actions.githubusercontent.com \
32+
--client-id-list sts.amazonaws.com \
33+
--thumbprint-list 1234567890123456789012345678901234567890
34+
```
35+
36+
37+
## IAMロール
38+
39+
### 利用するリポジトリ
40+
41+
`OWNER`」と「`REPO`」はご自身の環境にあわせて変更してください。
42+
43+
```shell
44+
export GITHUB_REPOSITORY=<OWNER>/<REPO>
45+
```
46+
47+
### Identity ProviderのURL
48+
49+
```shell
50+
export PROVIDER_URL=token.actions.githubusercontent.com
51+
```
52+
53+
### AWSアカウントID
54+
55+
```shell
56+
export AWS_ID=$(aws sts get-caller-identity --query Account --output text)
57+
```
58+
59+
### IAMロール名
60+
61+
```shell
62+
export ROLE_NAME=github-actions
63+
```
64+
65+
66+
#### Assume Roleポリシーを定義したJSONファイルの作成
67+
68+
```shell
69+
cat <<EOF > assume_role_policy.json
70+
{
71+
"Version": "2012-10-17",
72+
"Statement": [
73+
{
74+
"Effect": "Allow",
75+
"Action": "sts:AssumeRoleWithWebIdentity",
76+
"Principal": {
77+
"Federated": "arn:aws:iam::${AWS_ID}:oidc-provider/${PROVIDER_URL}"
78+
},
79+
"Condition": {
80+
"StringLike": {
81+
"${PROVIDER_URL}:sub": "repo:${GITHUB_REPOSITORY}:*"
82+
}
83+
}
84+
}
85+
]
86+
}
87+
EOF
88+
```
89+
90+
#### IAMロールの作成
91+
92+
```shell
93+
aws iam create-role \
94+
--role-name $ROLE_NAME \
95+
--assume-role-policy-document file://assume_role_policy.json
96+
```
97+
98+
#### IAMポリシーのアタッチ
99+
100+
```shell
101+
aws iam attach-role-policy \
102+
--role-name $ROLE_NAME \
103+
--policy-arn arn:aws:iam::aws:policy/IAMReadOnlyAccess
104+
```
105+
106+
107+
## OpenID ConnectによるAWS連携
108+
109+
ココから先はローカル環境での作業です。
110+
111+
### AWSアカウントIDのSecrets登録
112+
113+
```shell
114+
gh secret set AWS_ID --body "<AWSアカウントID>"
115+
```
116+
117+
118+
### IAMロール名のSecrets登録
119+
120+
```shell
121+
gh secret set ROLE_NAME --body "<IAMロール名>"
122+
```

command/12/README.md

Lines changed: 233 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,233 @@
1+
# 第12章
2+
3+
## AWS Copilotによるプロビジョニング
4+
5+
ココから先はAWS CloudShellでの作業です。
6+
7+
### AWS Copilotのバージョン確認
8+
9+
```shell
10+
copilot --version
11+
```
12+
13+
### AWS Copilotで使用する値を環境変数へセット
14+
15+
```shell
16+
export APP_NAME=demo
17+
export SVC_NAME=example
18+
export ENV_NAME=test
19+
```
20+
21+
22+
### マニフェストファイルの作成
23+
24+
```shell
25+
copilot app init $APP_NAME
26+
copilot svc init --name $SVC_NAME --app $APP_NAME \
27+
--image nginx --port 80 --svc-type "Load Balanced Web Service"
28+
```
29+
30+
31+
## テスト環境の構築
32+
33+
### リソースの作成
34+
35+
```shell
36+
copilot env init --name $ENV_NAME --app $APP_NAME \
37+
--profile default --default-config
38+
copilot env deploy --name $ENV_NAME
39+
copilot svc deploy --name $SVC_NAME --env $ENV_NAME
40+
```
41+
42+
### curlによる動作確認
43+
44+
URLはご自身のものと差し替えてください。
45+
46+
```shell
47+
curl -I http://demo-xxx.ap-northeast-1.elb.amazonaws.com
48+
```
49+
50+
51+
## デプロイメントIAMロール
52+
53+
### ポリシードキュメントの作成
54+
55+
```shell
56+
cat <<EOF > policy.json
57+
{
58+
"Version": "2012-10-17",
59+
"Statement": [
60+
{
61+
"Effect": "Allow",
62+
"Action": [
63+
"ecr:GetAuthorizationToken",
64+
"ecr:BatchGetImage",
65+
"ecr:BatchCheckLayerAvailability",
66+
"ecr:CompleteLayerUpload",
67+
"ecr:GetDownloadUrlForLayer",
68+
"ecr:InitiateLayerUpload",
69+
"ecr:PutImage",
70+
"ecr:UploadLayerPart",
71+
"ecs:DescribeTaskDefinition",
72+
"ecs:RegisterTaskDefinition",
73+
"ecs:UpdateService",
74+
"ecs:DescribeServices"
75+
],
76+
"Resource": "*"
77+
},
78+
{
79+
"Effect": "Allow",
80+
"Action": ["iam:PassRole"],
81+
"Resource": "*",
82+
"Condition": {
83+
"StringLike": {
84+
"iam:PassedToService": "ecs-tasks.amazonaws.com"
85+
}
86+
}
87+
}
88+
]
89+
}
90+
EOF
91+
```
92+
93+
### IAMポリシーの新規作成
94+
95+
```shell
96+
export POLICY_NAME=deploy-${APP_NAME}-${SVC_NAME}
97+
aws iam create-policy --policy-name $POLICY_NAME \
98+
--policy-document file://policy.json
99+
```
100+
101+
### IAMロールへ作成したIAMポリシーをアタッチ
102+
103+
```shell
104+
export ROLE_NAME=github-actions
105+
export AWS_ID=$(aws sts get-caller-identity --query Account --output text)
106+
aws iam attach-role-policy --role-name $ROLE_NAME \
107+
--policy-arn "arn:aws:iam::${AWS_ID}:policy/${POLICY_NAME}"
108+
```
109+
110+
111+
## デプロイ情報の取得
112+
113+
### ECSクラスター名の取得
114+
115+
```shell
116+
aws ecs list-clusters --output text \
117+
--query "clusterArns[?contains(@, '${APP_NAME}-${ENV_NAME}')]" \
118+
| cut -d/ -f2
119+
```
120+
121+
### ECSサービス名の取得
122+
123+
`--cluster`フラグの値は、手前で取得したECSクラスター名に差し替えてください。
124+
125+
```shell
126+
aws ecs list-services --cluster "<ECSクラスター名>" --output text \
127+
--query "serviceArns[?contains(@, '${APP_NAME}-${ENV_NAME}')]" \
128+
| cut -d/ -f3
129+
```
130+
131+
### タスク定義名の取得
132+
133+
```shell
134+
aws ecs list-task-definitions --status ACTIVE --sort DESC --output text \
135+
--query "taskDefinitionArns[?contains(@, '${APP_NAME}-${ENV_NAME}')]" \
136+
| cut -d/ -f2 | cut -d: -f1
137+
```
138+
139+
### ECRリポジトリURIの取得
140+
141+
```shell
142+
aws ecr describe-repositories --output text \
143+
--query "repositories[?contains(repositoryUri, '$APP_NAME')].repositoryUri"
144+
```
145+
146+
### コンテナ名の取得
147+
148+
```shell
149+
echo $SVC_NAME
150+
```
151+
152+
153+
## デプロイ情報の登録
154+
155+
ココから先はローカル環境での作業です。
156+
157+
```shell
158+
gh variable set ECS_CLUSTER_NAME --body "<ECSクラスター名>"
159+
gh variable set ECS_SERVICE_NAME --body "<ECSサービス名>"
160+
gh variable set TASK_DEFINITION_NAME --body "<タスク定義名>"
161+
gh variable set ECR_REPOSITORY_URI --body "<ECRリポジトリURI>"
162+
gh variable set CONTAINER_NAME --body "<コンテナ名>"
163+
```
164+
165+
166+
## デプロイの実行
167+
168+
### デプロイワークフローの実行
169+
170+
```shell
171+
gh workflow run deploy.yml
172+
```
173+
174+
### デプロイの実行結果を確認
175+
176+
URLはご自身のものと差し替えてください。
177+
178+
```shell
179+
curl http://demo-xxxx.ap-northeast-1.elb.amazonaws.com
180+
```
181+
182+
183+
## 本番環境の構築
184+
185+
ココから先はAWS CloudShellでの作業です。
186+
187+
```shell
188+
export ENV_NAME=prod
189+
```
190+
191+
192+
## Environmentsによるデプロイ情報の管理
193+
194+
ココから先はローカル環境での作業です。
195+
196+
```shell
197+
export ENV_NAME=prod
198+
gh variable set ECS_CLUSTER_NAME --body "<ECSクラスター名>" --env $ENV_NAME
199+
gh variable set ECS_SERVICE_NAME --body "<ECSサービス名>" --env $ENV_NAME
200+
gh variable set TASK_DEFINITION_NAME --body "<タスク定義名>" --env $ENV_NAME
201+
```
202+
203+
## 複数環境向けデプロイワークフロー
204+
205+
### テスト環境
206+
207+
```shell
208+
gh workflow run deploy.yml -f environment-name=test
209+
```
210+
211+
### 本番環境
212+
213+
```shell
214+
gh workflow run deploy.yml -f environment-name=prod
215+
```
216+
217+
218+
## 実行環境の後始末
219+
220+
ココから先はAWS CloudShellでの作業です。
221+
222+
### AWS Copilotで作成したリソースの削除
223+
224+
```shell
225+
copilot app delete --yes
226+
```
227+
228+
### OpenID Connect Providerの削除
229+
230+
```shell
231+
aws iam delete-open-id-connect-provider --open-id-connect-provider-arn \
232+
arn:aws:iam::${AWS_ID}:oidc-provider/token.actions.githubusercontent.com
233+
```

0 commit comments

Comments
 (0)