SlideShare a Scribd company logo
仮想通貨取引所bitbank のIaC の導⼊と実践
2019/07/30 X-Tech JAWS @AWS
→← 1 / 45
Who?
Shogo Ishikawa (@koarakko99)
Engineer @ Bitbank (2018/04-)
AWS Team
CI/CD
Account management
Fargate, EB
Favorite service
CloudFormation, VPC
→← 2 / 45
Who?
Yuta Suzuki (@euxn23)
Engineer @ Bitbank (2018/07-)
Developer Success Team
DeveloperSuccess として何を届けられるか、様々な分野を経た先として何ができるか
AWS, DevOps, NodeJS Engineer
formerly, Application Engineer (Angular / TS Backend)
Using AWS half a year
awswakaran.tokyo co-founder (w/@potato4d)
bitbank とは
ビットバンクは、ビットコインなどを扱う仮想通貨取引所です
bitbank.cc はAngular + TypeScript + AWS です
bitbank における活⽤状況
ElasticBeanstalk を利⽤したCodePipeline
CloudFormation StackSets を利⽤したアカウント管理
GitLab Runner の構築
導⼊編
なぜIaC を導⼊したのか?
リソースが何が起因作られたかわからなくなった
同じ環境を⼿作業で作るのがシンドかった
環境を何回も作り直したかった。
なぜCloudFormation を採⽤したか?
AWS 以外のクラウドの利⽤予定がなかった
AWS ドキュメントに慣れていたため
悩みをAWS サポートに相談できるから
CloudFormation の習得するためにやったこと
AWS CloudFormation の公式ドキュメントを読んだ
GitHub で他⼈のコードを読んだ
Resource 名で検索するとヒットするのでそれを読んだ
特に習得しておくと便利なテクニック
疑似パラメータを積極的に使う。
なるべくnested しておき、汎⽤性を⾼める
最初⼿作業で作って、describe の結果を利⽤
疑似パラメータを積極的に使う。
アカウントID => AWS::AccountId
リージョン=> AWS::Region
スタックID => AWS::StackId など
なるべくnested しておき、汎⽤性を⾼める
Resources:
IamRole:
Type: AWS::CloudFormation::Stack
Properties:
TemplateURL: ../../components/iam.yml
Parameters:
IamPolicy: !Ref IamPolicy
MyInstance:
Type: AWS::CloudFormation::Stack
Properties:
TemplateURL: ../../components/ec2.yml
Parameters:
SubnetId: !Ref SubnetId
ImageId: !Ref ImageId
InstanceType: !Ref InstanceType
InstanceName: MyInstance
KeyName: !Ref KeyName
IamRole: !GetAtt IamRole.Outputs.MyInstanceProfile
SecurityGroupId: !Ref SecurityGroupId
最初⼿作業で作って、describe の結果を利⽤
$ aws codepipeline get-pipeline
...
{
"pipeline": {
"name": "test",
"roleArn": "arn:aws:iam::xxxxxxxxxxxx:role/dev-test-codepipeline",
"artifactStore": {
"type": "S3",
"location": "testbucket"
},
"stages": [
{
"name": "Source",
"actions": [
{
"name": "App",
"actionTypeId": {
"category": "Source",
"owner": "AWS",
"provider": "CodeCommit",
"version": "1"
},
"runOrder": 1,
"configuration": {
"BranchName": "dev",
"RepositoryName": "testrepo"
},
"outputArtifacts": [
{
"name": "App"
}
],
"inputArtifacts": []
}
]
},
...
CLI の結果を転記する
Pipeline:
Type: AWS::CodePipeline::Pipeline
Properties:
Name: !Ref ApplicationName
RoleArn: !GetAtt CodePipelineServiceRole.Arn
ArtifactStore:
Type: S3
Location: testbucket
Stages:
- Name: Source
Actions:
- Name: App
ActionTypeId:
Category: Source
Owner: AWS
Version: 1
Provider: CodeCommit
Configuration:
RepositoryName: testrepo
BranchName: dev
OutputArtifacts:
- Name: App
RunOrder: 1
クロススタック参照は使わなかった以下のような記述
Outputs:
WebSG:
Description: Service VPC
Value: !Ref ServiceVPC
Export:
Name: 'stack-service-vpc'
使わなかった理由
クロススタック参照の値を変更がしづらい
テスト時などで値を変えたい
ParameterStore を使うメリット
値の変換が簡単
⼀覧で⾒やすい
代わりにParameterStore に値を⼊れたSG のARN をParameterStore に格納
Resources:
InstanceSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: test-sg
VpcId: !Ref VpcId
SecurityGroupEgress:
- IpProtocol: '-1'
CidrIp: 0.0.0.0/0
SecurityGroupIdParameter:
Type: AWS::SSM::Parameter
Properties:
Name: test-sg
Type: String
Value: !Ref InstanceSecurityGroup
取得時
AWSTemplateFormatVersion: '2010-09-09'
Description: Main template.
Parameters:
SecurityGroupId:
Type: AWS::SSM::Parameter::Value<String<AWS::EC2::SecurityGroup::Id>>
Default: test-sg
そのほか、CloudFormation で苦労したところ
サービスの制約
⽂字数制限
IAM 権限の不⾜
権限を厳密に書きすぎて、必要な権限が⾜りない
全部が対応している訳ではない。
導⼊編まとめCloudFormation は最初にドキュメントを読んで全体をつかんだ⽅がよい
実際に作るときは、AWS CLI を使うことで簡単にResource の値を⼊れられる
実践編
Q. CloudFormation の実⾏、どうしてますか?
A. make?make は冪等性担保と相性が良い
make は複雑な引数処理ができる
make は使い回しができる
_⼈⼈⼈⼈⼈_
> できる <
 ̄Y^Y^Y^Y  ̄
(簡単とは⾔っていない)
Q. make ではtoo much なケースでは?
A. npm script
bitbank はJS が社内標準語なので
package.json(npm run) で⼀部管理しています
(CDK がnpm ecosystem なので、今後AWS 系のエンジニアにもnpm は普及するはず)
メリット
何をやっているかわかりやすくするため
IaC は読むためにあるので、読みやすさは⼤事
コマンドのオペミスを減らすため
IaC コマンドを⼿順書からコピー&ペーストしているとそのうち絶対にミスするので
例
GitLab CI Runner の構築
フロントエンド検証環境の構築
なぜCFn の簡易コマンド化が必要か
デプロイ対象や検証環境ごとに権限対象が異なる
デプロイ対象や検証環境が増えるたびに環境を作成する
AWS 担当以外の開発者もCFn を触れることで開発を⾼速化できる
Q. CloudFormation にないところはどう実⾏するか
A. SDK を使って冪等っぽくなるようにたたく
具体例
Fargate の環境変数のValueFrom (ParameterStore からの取得は)
⻑らくCFn では記述できなかった
現在は実装済み
TaskDefinitions を更新するたびにただの環境変数に戻ってしまう
デプロイの都度、主導で直すのは⼿間だし、忘れる
SDK で解決(冪等になります)
const taskDefinitionFamilies = await ecs.listTaskDefinitionFamilies({ status: 'ACTIVE' }).promise();
if (!taskDefinitionFamilies.families) {
throw new Error('listTaskDefinitionFamilies failed');
}
for (const family of taskDefinitionFamilies.families) {
console.log(`${family} task definition update start`);
const { taskDefinition } = await ecs.describeTaskDefinition({ taskDefinition: family }).promise();
if (!taskDefinition || !taskDefinition.containerDefinitions) {
throw new Error('describeTaskDefinition failed');
}
const { containerDefinitions, executionRoleArn, cpu, memory, taskRoleArn, requiresCompatibilities, networkMode } = taskDefinition;
const requestContainerDefinitions = containerDefinitions.map((def) => ({
...def,
secrets: [
...(def.secrets || []),
...def
.environment!.filter((env) => envToSecretKeys.includes(env.name!))
.map((env) => ({
name: env.name!,
valueFrom: env.value!,
})),
],
environment: def.environment!.filter((env) => !envToSecretKeys.includes(env.name!)),
}));
Q. CFn のparameter-overrides って実⾏時エラー出したくない
A. 型安全になるようにTypeScript のtemplate から注⼊する
(quicktype.js を使いました)
config.template.yml.ts
import { Convert, Env } from './env.quicktype';
export function prepare(env: string = 'default'): Env {
const envJson = JSON.stringify(require(`./.env.${env}`));
return Convert.toEnv(envJson);
}
// language=yaml
export default ({ envName, nodeEnv, awsAccountId, defaultCpu, defaultMemoryMb }: Env) => `
all:
Application: app
SSMKeyPrefix: /${envName}/
...
env.quicktype.ts
export interface Env {
envName: string;
nodeEnv: string;
awsAccountId: string;
defaultCpu: string;
defaultMemoryMb: string;
}
env.develop.ts
import { Env } from './env.quicktype';
const env: Env = {
envName: 'app-dev',
nodeEnv: 'develop',
awsAccountId: '123456789012',
defaultCpu: '256',
defaultMemoryMb: '512'
};
module.exports = env;
materialize-template.ts
import * as fs from 'fs';
import { resolve } from 'path';
import main, { prepare } from './config.template.yml';
const env = process.env.ENV;
if (!env) {
throw new Error('$ENV is required');
}
fs.writeFileSync(resolve(__dirname, `config.${env}.yml`), main(prepare(env)));
アプリケーション指向の解決⽅法を実践
。o (モノによってはaws-sdk (node) の型定義がそのままうまく使えるかも?)
実践編まとめCloudFormation は使うとき/読むときのことを考える
CloudFormation の限界はSDK を使って超える
アプリケーション的なアプローチでより効率的かつ安全にする
今後の展望CloudFormation の社内普及を進めたい
CloudFormation のノウハウを⾔語化して共有したい
CDK の導⼊によりアプリケーションエンジニアでも触りやすくしたい

More Related Content

PDF
DeveloperSuccess として何を届けられるか、様々な分野を経た先として何ができるか
PPT
RecoChoku tech night #09 -reinvent2018報告会- オープニング
PDF
ビットバンクにおける少人数で支えるインフラチームの戦略
PDF
DSXでデータ・サイエンス
PDF
Deploy TypeScript with CodePipeline in Fargate
PPTX
IBM Cloud 2017年 振り返り
PDF
IBM Cloud Private の全貌 (Kubernetesベース)
PDF
Introduction of bitbank frontend development environment
DeveloperSuccess として何を届けられるか、様々な分野を経た先として何ができるか
RecoChoku tech night #09 -reinvent2018報告会- オープニング
ビットバンクにおける少人数で支えるインフラチームの戦略
DSXでデータ・サイエンス
Deploy TypeScript with CodePipeline in Fargate
IBM Cloud 2017年 振り返り
IBM Cloud Private の全貌 (Kubernetesベース)
Introduction of bitbank frontend development environment

What's hot (20)

PPTX
AWS IoTを使った双方向通信システムの実装と注意点
PDF
Lightning Network, Swap, Nloop
PDF
めっちゃお得なDNS。Alibaba Cloud DNS を diggin’ @Alibaba Cloud Developers Meetup #2 - ...
PPTX
201312クラウド女子会
PPTX
Alieaters2 alibabacloud 20180320
PDF
Node.jsアプリの開発をモダン化するために取り組んできたこと
PDF
Deploy TypeScript Application by CodePipeline
PDF
Ad Tech on AWS - IVS CTO Night and Day Spring 2016
PPTX
SORACOM と Azure で IoT
PDF
Kubernetes+Ansibleでつくる最新Linuxディストリビューション開発環境
PDF
5分でわかるAWS IoT! - あなたも今日からIoT生活 -
PDF
【IVS CTO Night & Day】AWSにおけるビッグデータ活用
PDF
NW-JAWS x Tech-on勉強会:AWS Transit Gateway で広がる ネットワークアーキテクチャ
PDF
15分でわかるAWSクラウドで コスト削減できる理由
PPTX
Networking for cloud migration
PDF
K8s-icp-capsmalt-jjugccc2018spring
PDF
Architecting on Alibaba Cloud - 超基礎編 -
PDF
サーバーレス・アーキテクチャ概要
PDF
AWSマネージドサービスをフル活用したヘルスケアIoTプラットフォーム
PDF
170311 JAWS days 2017 fintech
AWS IoTを使った双方向通信システムの実装と注意点
Lightning Network, Swap, Nloop
めっちゃお得なDNS。Alibaba Cloud DNS を diggin’ @Alibaba Cloud Developers Meetup #2 - ...
201312クラウド女子会
Alieaters2 alibabacloud 20180320
Node.jsアプリの開発をモダン化するために取り組んできたこと
Deploy TypeScript Application by CodePipeline
Ad Tech on AWS - IVS CTO Night and Day Spring 2016
SORACOM と Azure で IoT
Kubernetes+Ansibleでつくる最新Linuxディストリビューション開発環境
5分でわかるAWS IoT! - あなたも今日からIoT生活 -
【IVS CTO Night & Day】AWSにおけるビッグデータ活用
NW-JAWS x Tech-on勉強会:AWS Transit Gateway で広がる ネットワークアーキテクチャ
15分でわかるAWSクラウドで コスト削減できる理由
Networking for cloud migration
K8s-icp-capsmalt-jjugccc2018spring
Architecting on Alibaba Cloud - 超基礎編 -
サーバーレス・アーキテクチャ概要
AWSマネージドサービスをフル活用したヘルスケアIoTプラットフォーム
170311 JAWS days 2017 fintech
Ad

Similar to 仮想通貨取引所 bitbank の IaC の導入と実践 (20)

PDF
ソフトバンクにおける Java による クラウドネイティブの実現
PDF
Real World Android Akka - 日本語版
PDF
Azureをフル活用したサーバーレスの潮流について
PDF
Serverless for VUI
PDF
.NET Coreから概観する.NETのOSSへの取り組み
PDF
クラウド+ソフトウェアで起こすイノベーション
PDF
AWS CloudFormationによるInfrastructure as Codeの実現
PDF
試して学べるクラウド技術! OpenShift
PDF
Amazon EC2 Container Service Deep dive
PDF
インフラセキュリティブートキャンプ #seccamp
PDF
【初心者向け】API を使ってクラウドの管理を自動化しよう
PDF
JAWS-UGアーキテクチャ専門支部 ServerlessConfレポート
PDF
AWSによるサーバーレスアーキテクチャ
PPTX
SpringOne Platform Replay -Pivotal Cloud Foundry-
PDF
UnityとAmazon Web Servicesで生み出す新しい価値
PPTX
JAWS目黒 EC2チューニングTips #jawsmeguro #jawsug
PDF
サーバーレスの今とこれから
PDF
Running Java Apps with Amazon EC2, AWS Elastic Beanstalk or Serverless
PDF
AWS Introduction for Startups
KEY
Rdbms起点で考えると見えない世界 okuyama勉強会
ソフトバンクにおける Java による クラウドネイティブの実現
Real World Android Akka - 日本語版
Azureをフル活用したサーバーレスの潮流について
Serverless for VUI
.NET Coreから概観する.NETのOSSへの取り組み
クラウド+ソフトウェアで起こすイノベーション
AWS CloudFormationによるInfrastructure as Codeの実現
試して学べるクラウド技術! OpenShift
Amazon EC2 Container Service Deep dive
インフラセキュリティブートキャンプ #seccamp
【初心者向け】API を使ってクラウドの管理を自動化しよう
JAWS-UGアーキテクチャ専門支部 ServerlessConfレポート
AWSによるサーバーレスアーキテクチャ
SpringOne Platform Replay -Pivotal Cloud Foundry-
UnityとAmazon Web Servicesで生み出す新しい価値
JAWS目黒 EC2チューニングTips #jawsmeguro #jawsug
サーバーレスの今とこれから
Running Java Apps with Amazon EC2, AWS Elastic Beanstalk or Serverless
AWS Introduction for Startups
Rdbms起点で考えると見えない世界 okuyama勉強会
Ad

More from bitbank, Inc. Tokyo, Japan (20)

PDF
インフラチームの歴史とこれから
PDF
ビットバンクのデプロイ戦略について
PDF
ビットバンク流 アジャイル開発の紹介.pdf
PDF
ビットバンクで求められるプロジェクトマネジメント
PDF
ビットバンクでのネイティブアプリケーション開発におけるCI_CD環境
PDF
ビットバンクのマッチングエンジン.pdf
PDF
bitbank Corporate Information
PDF
ng build --prod & Continuous Delivery
PDF
マーブル図で怖くないRxJS
PDF
持続的な運用開発のために社内基盤を整えている話 〜auditのCI組み込みやlintの社内PKG化〜
PDF
中規模Angularアプリケーションの再設計
PDF
ビットコインウォレットで手軽にパスワードレス認証が可能なbitidについての紹介
PPTX
Ethereumのシャーディング概論
PDF
Daocasinoにおけるstate channel実装
PDF
TypeScriptでライトニングネットワークを使ってみよう
PDF
20181108 bitbank lt-maintainable-e2e-testing
PDF
Angular Refactoring in Real World
PDF
アプリケーション開発目線から考える テストの書き方について
PDF
ビットバンクの開発におけるAWSの利用
PDF
インフラチームの歴史とこれから
ビットバンクのデプロイ戦略について
ビットバンク流 アジャイル開発の紹介.pdf
ビットバンクで求められるプロジェクトマネジメント
ビットバンクでのネイティブアプリケーション開発におけるCI_CD環境
ビットバンクのマッチングエンジン.pdf
bitbank Corporate Information
ng build --prod & Continuous Delivery
マーブル図で怖くないRxJS
持続的な運用開発のために社内基盤を整えている話 〜auditのCI組み込みやlintの社内PKG化〜
中規模Angularアプリケーションの再設計
ビットコインウォレットで手軽にパスワードレス認証が可能なbitidについての紹介
Ethereumのシャーディング概論
Daocasinoにおけるstate channel実装
TypeScriptでライトニングネットワークを使ってみよう
20181108 bitbank lt-maintainable-e2e-testing
Angular Refactoring in Real World
アプリケーション開発目線から考える テストの書き方について
ビットバンクの開発におけるAWSの利用

仮想通貨取引所 bitbank の IaC の導入と実践