Upgrade to Pro — share decks privately, control downloads, hide ads and more …

AWSの全てをコードで管理する方法〜その理想と現実〜

濱田孝治
November 01, 2019

 AWSの全てをコードで管理する方法〜その理想と現実〜

AWSの最大の特徴の一つ、「コードによるインフラの運用管理」

アプリケーションやインフラ運用のさらなる効率化を目指す時、IaC(Infrastructure as Code)の導入は必須と言えます。その効果は絶大ですが、下手に導入してしまうと逆に運用管理自体の硬直化を招き「最初は楽しかったのに、今はなんでこんな辛いんだろう…」という気持ちになってしまいます。

このセッションでは、CloudFormationについてそのIaCの手段について触れつつ、各運用現場に即したIaCを導入するために考えるべきことについて、お話します。

濱田孝治

November 01, 2019
Tweet

More Decks by 濱田孝治

Other Decks in Technology

Transcript

  1. 8 CloudFormationの位置付け CloudFormation VPC Public subnet Amazon EMR Amazon Kinesis

    Data Firehose Amazon Athena Amazon Simple Notification Service Amazon Simple Queue Service Amazon EC2 Amazon Elastic Container Service AWS Lambda AWS Fargate Amazon WorkSpaces AWS IoT Core Amazon Personalize Amazon CloudWatch Amazon Simple Storage Service (S3) Amazon RDS
  2. 19 Infrastructure as Codeとはなにか︖ aws cliで作成する場合 $aws ec2 create-vpc --

    cidr-block 10.0.0.0/16 VPC 10.0.0.0/16 create-vpc.sh (Shell形式)
  3. VPC 10.0.0.0/16 VPC 10.0.0.0/16 VPC 10.0.0.0/16 20 Infrastructure as Codeとはなにか︖

    aws cliは処理を定義するため、複数回実⾏した場合、 その処理が毎回実⾏され、そのたびにインフラ側が更新 される $aws ec2 create-vpc -- cidr-block 10.0.0.0/16 VPC 10.0.0.0/16 create-vpc.sh (Shell形式) 実⾏するだけ インフラは増えていく
  4. 22 代表的なInfrastructure as Codeの⼿法 • AWS CloudFormation • Terraform by

    HashiCorp • Cloud Development Kit(CDK) 今⽇のメインコンテンツ
  5. 24 CloudFormationの概要 • テンプレート • CloudFormationの最も要となる部分 AWSTemplateFormatVersion: '2010-09-09' Description: codecommit

    and ecr Parameters: accountAllias: Type: String accountAlliasLowerCase: Type: String Resources: ecr: Type: AWS::ECR::Repository Properties: RepositoryName: !Sub ${accountAlliasLowerCase}-ecr Outputs: ecr: Value: !GetAtt ecr.Arn Export: Name: ecr • テキストファイルで記述 • JSON/YAML • スタックのリソース状態 を記述 • リソースを記載する順番 は関係なし (CloudFormationが⾃動 的に解決)
  6. 27 CloudFormationの概要 • AWSのサービス全てに対応しているわけではない • ただ、普通に使うサービスはほぼ網羅されている ASK AmazonMQ Amplify Console

    API Gateway API Gateway V2 Application Auto Scaling App Mesh AppStream 2.0 AppSync Athena AWS Auto Scaling Amazon EC2 Auto Scaling AWS Backup AWS Batch AWS Budgets Certificate Manager AWS Cloud9 CloudFormation CloudFront AWS Cloud Map CloudTrail CloudWatch [CloudWatch Logs] CloudWatch イベント CodeBuild CodeCommit CodeDeploy CodePipeline CodeStar Amazon Cognito Config AWS Data Pipeline DAX Directory Service DLM DMS Amazon DocumentDB DynamoDB EC2 Amazon ECR ECS EFS EKS ElastiCache Elasticsearch Elastic Beanstalk Elastic Load Balancing ElasticLoadBalancingV2 Amazon EMR FSx GameLift AWS Glue GuardDuty IAM Inspector IoT IoT1Click IoT Analytics IoTEvents AWS IoT Greengrass AWS IoT Things Graph Amazon Kinesis KinesisAnalytics Amazon Kinesis Data Analytics V2 Amazon Kinesis Data Firehose KMS LakeFormation Lambda ManagedBlockchain MediaLive MediaStore MSK Amazon Neptune OpsWorks OpsWorks-CM Pinpoint PinpointEmail QLDB RAM RDS Amazon Redshift RoboMaker Route 53 Route 53 Resolver Amazon S3 Amazon SageMaker Secrets Manager Service Catalog SecurityHub SES Amazon SimpleDB Amazon SNS Amazon SQS ステップ関数 Systems Manager AWS SFTP WAF WAF Regional WorkSpaces 共有プロパティタイプ
  7. 30 CloudFormationを使う主なメリット • インフラの管理を簡略化 • ⼀度テンプレートからスタックを作成しておくと変更が簡 単。また、スタック単位でのリソース⼀括削除も可能 • インフラを簡単に複製可能 •

    テンプレートを使い回すことで、複数リージョンへのイン フラ展開が簡単 • インフラの変更管理が可能 • テンプレートのテキストファイルをベースにすることで バージョン管理システムによるインフラ管理が可能
  8. 37 CloudFormationを使う主なメリット(再掲) • インフラの管理を簡略化 • ⼀度テンプレートからスタックを作成しておくと変更が簡 単。また、スタック単位でのリソース⼀括削除も可能 • インフラを簡単に複製可能 •

    テンプレートを使い回すことで、複数リージョンへのイン フラ展開が簡単 • インフラの変更管理が可能 • テンプレートのテキストファイルをベースにすることで バージョン管理システムによるインフラ管理が可能
  9. 38 CloudFormationを使う主なメリット(再掲) • インフラの管理を簡略化 • ⼀度テンプレートからスタックを作成しておくと変更が簡 単。また、スタック単位でのリソース⼀括削除も可能 • インフラを簡単に複製可能 •

    テンプレートを使い回すことで、複数リージョンへのイン フラ展開が簡単 • インフラの変更管理が可能 • テンプレートのテキストファイルをベースにすることで バージョン管理システムによるインフラ管理が可能 そもそも CloudFormationの実⾏そのものに 再現性が必須
  10. 41 各コマンドの挙動の違い • create-stack、update-stack • 何故かコマンドに冪等性がない • スタックが無いときはcreate→2回⽬以降はエラー • スタックが有るときはupdate→1回⽬はエラー

    • コマンドが⾮同期で実⾏される→別途結果を待ち受ける必要有り • 関連コマンドを使い分ける必要がある • wait stack-create-complete • create-change-set • wait change-set-create-complete • execute-change-set • wait stack-update-complete • wait stack-delete-complete
  11. 43 #!/bin/bash CFN_TEMPLATE=vpc.yml CFN_STACK_NAME=vpc # テンプレートの実⾏ aws cloudformation deploy --stack-name

    ${CFN_STACK_NAME} -- template-file ${CFN_TEMPLATE} ¥ --parameter-overrides ¥ NameTagPrefix=prd ¥ VPCCIDR=10.70 実⾏シェルの例
  12. 54 チェンジセットとは • deployするときデフォルトではチェンジセットの適 ⽤まで⾃動で実⾏される • チェンジセット作成して⽌める場合は、--no- execute-changesetを使う AWS CloudFormation

    App2Repos.yaml (template) AppRepos (Stack) Change set --no-execute-changeset 指定でここで⽌まる デフォルトではStackに 即反映される
  13. 55 実⾏シェルの例(改善例) #!/bin/bash CHANGESET_OPTION="--no-execute-changeset" if [ $# = 1 ]

    && [ $1 = "deploy" ]; then echo "deploy mode" CHANGESET_OPTION="" fi CFN_TEMPLATE=App2Repos.yml CFN_STACK_NAME=AppRepos # テンプレートの実⾏ aws cloudformation deploy --stack-name ${CFN_STACK_NAME} --template- file ${CFN_TEMPLATE} ${CHANGESET_OPTION} ¥ --parameter-overrides ¥ NameTagPrefix=prd ¥ VPCCIDR=10.70
  14. 62 スタックを分割するときに考えるべきこと • スタックに含めるリソースの数 • テンプレートが⼤きくなると可読性が 著しく下がるのをどうするか︖ • リソースの依存関係 •

    どのリソースがどのリソースを参照す るか︖ • ライフサイクル • リソースに対して変更が⼊る頻度は︖ • リソース変更の権限 • 誰がそのリソースを変更するのか︖ Amazon EC2 Amazon RDS Amazon VPC Security group Elastic Load Balancing (ELB)
  15. 64 スタックの分け⽅の実例 • 依存関係をシェルのファ イル名のプレフィックス で明⽰ • シェル実⾏順と依存関係 がひと⽬で分かる •

    テンプレートは別ディレ クトリにまとめても良い USFF  ᵓᴷᴷWQDTI ᵓᴷᴷTFDVSJUZHSPVQTI ᵓᴷᴷBMCTI ᵓᴷᴷFDTI ᵓᴷᴷSETTI ᵓᴷᴷBMCZNM ᵓᴷᴷFDZNM ᵓᴷᴷSETZNM ᵓᴷᴷTFDVSJUZHSPVQZNM ᵋᴷᴷWQDZNM
  16. 65 スタックの分け⽅の実例 実⾏シェル テンプレート スタック名 含まれるリソース 010-vpc.sh vpc.yml vpc •

    VPC • IGW、NGW • RouteTable • Subnet • EIP 020-security- group.sh securitygroup.yml securitygroup • SecurityGroup 030-alb.sh alb.yml alb • ApplicationLoadbalancer • TargetGroup 040-ec2.sh ec2.yml ec2 • EC2 • IAM Role • IAM Policy 050-rds.sh rds.yml rds • RDS • SubnetGroup • ParameterGroup
  17. 67 スタック間でリソースを参照する⽅法 • ⽅法①︓クロススタック参照を使う • CloudFormationマネージドな仕組み • 基本はこれ(ハマコー⼀番好きなやつ) • ⽅法②︓ダイナミック参照を使う

    • パラメータストアやSecrets Managerを参照 • ⽅法③︓シェルで頑張る • テンプレートを呼び出す前にシェルでパラメータを頑張っ て作る • なにげに汎⽤性は⼀番⾼い
  18. 69 ⽅法①︓クロススタック参照 Amazon EC2 Amazon RDS Amazon VPC Security group

    Elastic Load Balancing • あらかじめ参照されるスタックの⽅で名前決めてエク スポートしておけば、全スタックから参照できる
  19. 70 ⽅法①︓クロススタック参照(注意点) Amazon EC2 Amazon RDS Amazon VPC Security group

    Elastic Load Balancing • 参照しているスタックがある場合、参照元スタックで そのリソースの削除や変更ができない スタック削除や変更しようとすると 「参照先があるから無理」とエラーになる →運⽤上致命傷になりうるので注意
  20. Resources: rds: Type: AWS::RDS::DBInstance Properties: MasterUserPassword: {{resolve:ssm-secure:RDSMasterUserPassword:10}} 73 ⽅法②︓ダイナミック参照 •

    予めシェルやWebコンソール、もしくは、 CloudFormationの中で、パラメータストアや Secrets Managerの値を登録しておく • テンプレートでパラメータ名を指定して参照
  21. 74 ⽅法③︓シェルで頑張る • テンプレートに渡すパラメータをcliなどを駆使して取 得する # タスク設定⽤パラメータ CPU=256 MEMORY=512 IMAGE_URI=$(eval

    aws ecr describe-repositories --repository-names app-ecr -- query 'repositories[0].repositoryUri' --output text) # テンプレートの実⾏ aws cloudformation deploy --stack-name ${CFN_STACK_NAME} --template- file ${CFN_TEMPLATE} ¥ --capabilities CAPABILITY_NAMED_IAM ¥ --parameter-overrides ¥ accountAllias=${ACCOUNT_ALLIAS} ¥ accountAlliasLowerCase=${ACCOUNT_ALLIAS_LOWER_CASE} ¥ cpu=${CPU} ¥ memory=${MEMORY} ¥ imageUri=${IMAGE_URI}
  22. 82 返ってこない例② • ECSサービスの作成 • ECSのサービスが作成される→タスクが起動する→コンテ ナ起動して普通に使える→ログも正常 • 何故かスタック作成が終了しない •

    1時間後、タイムアウトからロールバックでコンテナも ECSサービスも削除される • #︕$%&#“@ʻ¥ • AWSサポート問い合わせ • ECSのサービス定義に不備があった→正直スマンカッタ • それならエラーだしていただけると…
  23. 84 対処⽅法 • 新機能がでて、APIは公開されるが CloudFormationで定義できないものはある • なにか試そうと思っても先にCloudFormationの公 式ドキュメントを必ず確認 • 対処⽅法

    • 基本対応されるのを待つしか無い • カスタムリソースを作る⽅法もある(魔境) • AWS CLIはほぼ即対応するので、シェルでそちらにいく のもあり
  24. 94 対処⽅法 • 実⾏タイミングは任意でもできるが⾃動で実⾏する⽅ 法もある • AWS Configに以下のマネージドルールが存在 • cloudformation-stack-drift-detection-check

    • 設定が変更されたタイミング、もしくは定期的にドリ フトの検出が⾃動で可能 • ドリフト検出されたタイミングでSNS経由でメールの受信 が可能︕︕
  25. 96 ドリフト検出も万能ではない • 検出できるリソースに制限有り • https://docs.aws.amazon.com/en_pv/AWSCloudFormation/l atest/UserGuide/using-cfn-stack-drift-resource-list.html • API Gateway,

    Auto Scaling, EC2, ECS, CloudWatch, DynamoDB, Lambda, RDS, S3, SNS, SQSなど • その他動的に設定されるプロパティなど検出できないものが ある • 詳細はこちら • スタックとリソースに対するアンマネージド型設定変更の検出 • https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/Us erGuide/using-cfn-stack-drift.html
  26. 100 CloudFormationを実⾏する場所候補 • 個⼈のクライアントPC • 適切な権限を保持したIAMユーザーでAWS CLIをインス トールして実⾏ • 適当なEC2インスタンス(Cloud9)

    • EC2インスタンスに適切なIAMロールを付与 • EC2インスタンスにSSH接続できるユーザーにより実⾏ • リポジトリからのパイプライン実⾏ • テンプレートのリポジトリコミットからのパイプラインに よる実⾏
  27. 101 CloudFormationを実⾏する場所候補 • 個⼈のクライアントPC • 適切な権限を保持したIAMユーザーでAWS CLIをインス トールして実⾏ • 適当なEC2インスタンス(Cloud9)

    • EC2インスタンスに適切なIAMロールを付与 • EC2インスタンスにSSH接続できるユーザーにより実⾏ • リポジトリからのパイプライン実⾏ • テンプレートのリポジトリコミットからのパイプラインに よる実⾏ テンプレートをバージョン管理する前提 のIaCにおいて、必然的な最終形態
  28. 102 パイプラインの⼀例 AWS CodePipeline AWS CodeCommit AWS CodeBuild template Stack

    Change set Shell 承 認 AWS CodeBuild template Change set Shell
  29. 103 CloudFormationのテストで利⽤できるツール • cfn-nag • https://github.com/stelligent/cfn_nag • CloudFormationテンプレートを解析し、セキュリ ティ的に脆弱な内容を検査するツール •

    ⾮常に強いIAMポリシーの適⽤ • 脆弱なセキュリティグループの適⽤ • S3バケットポリシーのワイルドカードプリンシパル • テンプレートに対してチェックするようにパイプライ ンを構築しておくことで⾃動化可能
  30. 105 さらに踏み込んだパイプラインの運⽤に向けて • CI/CD Pipeline for AWS CloudFormation Templates on

    the AWS Cloud Using AWS TaskCat • https://docs.aws.amazon.com/quickstart/latest/cicd- taskcat/welcome.html