~コード化の開始から頻出パターンまで~ · 大村幸敬 Amazon Web Services...

Post on 27-May-2020

0 views 0 download

Transcript of ~コード化の開始から頻出パターンまで~ · 大村幸敬 Amazon Web Services...

大村幸敬

Amazon Web Services ソリューションアーキテクト

~コード化の開始から頻出パターンまで~

Agenda

Who am I ?

大村幸敬(おおむらゆきたか)

• Solutions Architect @Amazon Web Services Japan

• エンタープライズのお客さまを担当

• Management Tools & DevOps 系サービスを担当

•好きなサービス: AWS CLI

"Are you

Well-Architected?”Werner Vogels

その運用は Well-Architected か?

アプリケーション• アジャイル開発で要件の変化に追従可能

インフラ• クラウドで初期投資なく迅速に変更可能

運用• 申請書と手順書と人海戦術で迅速に変更可能?

Well-Architected – Operational Excellenceの柱

原則

1. コードを使って運用する

2. 注記付きドキュメントを自動生成する

3. 頻繁に、小さく、可逆的に変更する

4. 運用手順を頻繁に見直す

5. 危険の事前予測と排除を行う

6. 全ての運用の失敗から学ぶ

Well-Architected Framework = AWS利用におけるベストプラクティスhttps://aws.amazon.com/jp/architecture/well-architected/

コードを使った運用のポイント from AWS Well-Architected

1. コードで全ての構成を定義

2. イベントに対してスクリプトで対処

3. アプリケーションと同じ手法でコードを開発

sh

sh

1. コードで全ての構成を定義

同じ環境を、迅速に、繰り返し作成可能

doc

sh sh sh sh

2. イベントに対してスクリプトで対処

自動的に、同じ処理を、繰り返し実施可能

sh sh sh sh sh

sh sh sh

3. アプリケーションと同じ手法でコードを開発

コードと作成した環境の品質を担保

sh

CI/CD*

sh

コードを使った運用のポイント from AWS Well-Architected

1. コードで全ての構成を定義• 同じ環境を、迅速に、多数作成可能

2. イベントに対してスクリプトで対処• 自動的に、同じ処理を、繰り返し実施可能

3. アプリケーションと同じ手法でコードを開発• コードと作成した環境の品質を担保

sh

sh

全ての構成変更はサービス利用者に影響

ver2.0 ?

*M/W = ミドルウェア

AWS環境に対するオペレーション方法

AWS

AWSのプロビジョニングサービスのカバー範囲

EC2

OS

M/W

App

デプロイ

他のサービス

デプロイ対象による管理範囲の違い

EC2

OS

M/W

App

Fargate

コンテナ

Lambda

App

デプロイ

デプロイ

デプロイ

AWS管理

ユーザ管理

APIへのアクセスと OSへのアクセス

CLI / SDK

ブラウザ

AW

S A

PI

マネジメント

コンソール

HTTPS

HTTPS

AW

S IA

M

(認証と認可)

EC2リモートデスクトップ

ターミナルRDPSSH

OSへのアクセス方法はオンプレと同様

セキュリティグループ設定

VPC作成

EC2作成

S3バケットの作成S3オブジェクトへのアクセス

AWS 環境を管理するためのツール

CLIとCFnを使ったAWS環境操作の流れ

sh

AWS CloudFormation

作成 /変更/削除

AWS CloudFormationAWS リソースの作成 / 変更 / 削除

テンプレート スタック

- 作成するリソースの定義- JSON/YAML

- AWS リソースの集合

CloudFormation 基本機能

••

••

••

AWS CLI

aws <service> <operation>

$ aws ec2 describe-instances

$ aws s3 cp hogehoge s3://bucket/key/to/file

AWS CLI 使いどころ

sh

AWS CLI CloudFormation

CloudFormation Tips

CI/CD*

* CI/CD = Continuous Integration / Continuous Deploy

CloudFormation Tips

CI/CD

テンプレートの基礎

テンプレート開発のTips

[IDE] AWS Cloud9

•ブラウザベース

• Syntax ハイライト

•キーワード補完

• Linux シェル環境

• AWS CLI & IAM Roleセットアップ済み

•各種開発ツール

[Parameters] AWS Systems Manager - Parameter Store

aws ssm put-parameter --name /MySystem/Prod/DB/User --type String --value myuser

aws ssm get-parameter --name /MySystem/Prod/DB/User{

"Parameter": {"Name": "/MySystem/Dev/DB/User","Type": "String","Value": "ohmurayu","Version": 1

}}

[Parameters] AWS Systems Manager - Parameter Store

• 自身で設定した値を使用

• AWSが提供する値を使用

Parameters: MyAMIID:

Type : AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>Default: /aws/service/ami-amazon-linux-latest/amzn-ami-hvm-x86_64-gp2

# Default: /aws/service/ami-windows-latest/Windows_Server-2016-English-Full-Base

注:SecureStringは2018/6/1時点で未対応

Parameters: Env:

Type: AWS::SSM::Parameter::Value<String>Default: /MySystem/Prod/DB/User

[Test] 各種ツールによるコードのチェック

••

••

cfn-python-lint + VS Code

cfn_nag

$ cfn_nag_scan -i public_alb.yaml------------------------------------------------------------public_alb.yaml------------------------------------------------------------| WARN W2|| Resources: ["PublicAlbSecurityGroup"]|| Security Groups found with cidr open to world on ingress.

This should never be true on instance. Permissible on ELB

Failures count: 0Warnings count: 1

https://github.com/awslabs/cfn-python-lint

https://github.com/stelligent/cfn_nag

CloudFormation Tips

CI/CD

スタック分割の例 – サンプルシステム

スタック分割 - 基本方針

スタック分割の例 – スタック構成

CloudFormation Tips

CI/CD

CI/CD* for CloudFormation

アプリケーション開発と同じやり方で環境全体を開発

* CI/CD = Continuous Integration / Continuous Deploy

sh

AWS CloudFormation Validation Pipeline

https://aws.amazon.com/jp/answers/devops/aws-cloudformation-validation-pipeline/

AWS CloudFormationValidation Pipeline

AWS CLI Tips

SA

ML

AWS CLI Tips

SA

ML

AWS CLI の利用開始

••

••

$ pip install awscli --upgrade --user

$ aws help

CLI オペレーションTips•

•$ complete -C '/usr/local/bin/aws_completer' aws

$ aws help$ aws ec2 help

CLI Tips - query

~/.aws/cli/alias

list-sgs = ec2 describe-security-groups ¥--query "SecurityGroups[].[GroupId, GroupName]" --output text

$ aws ec2 describe-security-groups ¥--query "SecurityGroups[].[GroupId, GroupName]" ¥

--output text

sg-bf8289da defaultsg-bf9256c6 op-ad-sgsg-c4f005bd rdp-httpsg-cb5953ae yu-http…

$ aws ec2 describe-security-groups{

"SecurityGroups": [{

"Description": "HTTPS+HTTP+ssh","GroupName": "default","IpPermissions": [

{"FromPort": 80,

$ aws list-sgssg-bf8289da defaultsg-bf9256c6 op-ad-sg…

AWS CLI Tips

SA

ML

CLI アクセス経路

• オンプレミスからVPCエンドポイントへのアクセス可否はAWSサービスと接続形態により異なる

AWS CLI Tips

SA

ML

CLI 認証&認可 - AWS認証情報

CLI 認証&認可 - 認証情報へのアクセス

CLI & -

CLI & -

[profile admin-org-account]aws_access_key_id = AKIDF...aws_secret_access_key = 1rHl...

[profile admin-team-account]source_profile = admin-org-accountrole_arn = arn:...:role/admin-team-account

~/.aws/config

$ aws s3 ls --profile admin-team-account

AssumeRoleWithSAML

LDAP identity store Identity provider (IdP)

role

awsprocesscreds-saml

CLI 認証&認可 – SAMLフェデレーションアクセス

SAML Idp(ADFSやOkta)にログインしてCLIに認証情報を渡すツール

https://github.com/awslabs/awsprocesscreds

~/.aws/config

[profile saml]credential_process = awsprocesscreds-saml -e 'https://corp.example.com/adfs/ls/IdpInitiatedSignOn.aspx?loginToRp=urn:amazon:webservices' -u username -p adfs -a arn:aws:iam::123456789012:role/ADFS-Dev

AWS CLI

$ aws s3 ls --profile saml

{“AccessKeyId”: “ADIF...”,“SecretAccessKey”: “2rFt...”,“Version”: 1

}

コマンド実行 awsprocesscreds-saml

awsprocesscreds-saml

アクセスキー

CLI 認証&認可 - フェデレーションアクセス

CLI & – MFA

[profile normal-access]aws_access_key_id = AKIDF...aws_secret_access_key = 1rHl...

[profile mfa-access]source_profile = normal-accessrole_arn = arn:...:role/mfa-access-rolemfa_serial = arn:...:mfa/mfa-of-user

~/.aws/config $ aws s3 ls s3://public-bkt/ --profile normal-access ...

$ aws s3 ls s3://restrict-bkt/ --profile mfa-access Enter MFA code for arn:...:mfa/mfa-of-user...

{"Version": "2012-10-17","Statement": [ {

"Effect": "Allow","Principal": {"AWS": {"arn:aws:iam::...:user/normal-user"}},"Action": "sts:AssumeRole","Condition": {"Bool": {"aws:MultiFactorAuthPresent": "true"}}

}]}

-

Organizationsアカウント払い出し (CLI)

organizations create-account

organizations list-create-account-status

iam create-role iam put-role-policy

organizations list-rootsorganizations list-organizational-units-for-parent

organizations list-parentsorganizations move-account

複数アカウントへの展開 - CloudFormation StackSet

StackSet

管理者アカウント

Region

Stack

ターゲットアカウントA

Stack

アカウント C アカウント D アカウント E …

Region

Stack Stack

アカウント C アカウント D アカウント E …

ターゲットアカウントB

ターゲットアカウントA

ターゲットアカウントB

CloudFormation StackSet - テンプレートの選択

CloudFormation StackSet - 適用範囲の指定

AWS Management Tools

EC2 CloudWatch Event

Status = Pending

Lambda

JSON/YAML変換は cfn-flip

$ cfn-flip vpc.json > vpc.yaml

テンプレートエンジンを使用したテンプレート作成

更新頻度と役割分担によってスタックを分ける(Cross Stack Reference)

②別のスタックから参照可能な値がエクスポートされる

①Exportを使って他のスタックから参照したい値をエクスポート例:セキュリティグループID

③ImportValue関数を使って値を参照する

テンプレート分割とスタック分割

テンプレート分割とスタック分割Nested Stacks(テンプレートの分割)

Cross Stack References(スタックの分割)

推奨ユースケース

テンプレートの再利用。1つのスタックを管理するために複数のテンプレートを使用する。

共用リソースのシェア。個別のスタックを個別のライフサイクルで独立管理できる。

利点 管理が容易。1つのスタックで全てを管理する。作成順序と依存関係が記述できる。

利害関係の分離。DBやVPCの共用。障害時影響範囲の限定。

考慮点 更新やロールバックの影響範囲が大きい。カスタムリソース名を持つテンプレートの再利用に注意。

リプレースアップデートになると物理IDが変化するため、参照側のスタックの更新が必要。個別スタックの作成順序を管理する必要あり。

専用CLI

CLI S3 -

Amazon S3 bucketAWS CLI

Thread pool

Disk

Thread 1

Thread 2

Thread 3

IO Thread

IO Queue

CLI S3 -

[default]region = ap-northeast-1s3 =

max_concurrent_requests = 20multipart_chunksize = 16MBmultipart_threshold = 64MBmax_queue_size = 10000

~/.aws/config

max_concurrent_requests = 4

Amazon S3 bucketAWS CLI

Thread pool

Disk

Thread 1

Thread 2

Thread 3IO Thread

IO Queue

Thread 4