Serverless で複数の AWS アカウントを使用する
はじめに
Serverless Framework とは
本ブログでも過去に何回か紹介した Serverless Framework は、AWS Lambda 関数を簡単に作成できるツールです。以下、過去記事です。
- Serverless Framework による AWS Lambda 関数の管理1 | もばらぶエンジニアブログ
- Serverless Framework による AWS Lambda 関数の管理2 | もばらぶエンジニアブログ
- Serverless で Python のパッケージを使った Lambda 関数をデプロイ | もばらぶエンジニアブログ
やりたいこと
Lambda に限った話ではありませんが、業務で AWS を使う場合、本番環境と開発・検証環境で別の AWS アカウントを使うというのは割と一般的です。本記事では、Serverless Framework で複数 AWS アカウントを使う方法を簡単に紹介します。
今回は本番環境(pro)と開発環境(dev)という2つの環境で、異なる AWS アカウントを使うという例で説明します。
手順
AWS CLI のプロファイルの設定
Serverless とは関係ありませんが、本番環境と開発環境それぞれで IAM アカウント及びアクセスキーを作成して、プロファイルに設定しておきます。
# ~/.aws/credentials
[foo-dev]
aws_access_key_id = AKIAAAAAAAAAAAAAAAAA
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[foo-pro]
aws_access_key_id = AKIBBBBBBBBBBBBBBBBB
aws_secret_access_key = yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
ステージ(dev, pro)毎に設定を分ける
Serverless には stage と言う概念があり、今回のような環境の切り替えの為に使われることが多いです。
色々細かいことを書く前に、まずは serverless.yml の例を記載します。(本題と関係ない部分は削っていますのでご了承下さい。)
custom:
awsAccountId:
dev: 111111111111
pro: 222222222222
region:
dev: us-east-1
pro: ap-northeast-1
deploymentBucket:
dev: foo-deployment-dev
pro: foo-deployment-pro
dataBucket:
dev: foo-dev
pro: foo-pro
provider:
name: aws
runtime: python3.6
stage: ${opt:stage, 'dev'}
region: ${self:custom.region.${self:provider.stage}}
# role iamRoleStatements で定義することも出来ますが、
# 事前に作っておき、以下の行のように指定した方が管理が楽です。
role: arn:aws:iam::${self:custom.awsAccountId.${self:provider.stage}}:role/Lambda_exec_role
deploymentBucket:
name: ${self:custom.deploymentBucket.${self:provider.stage}} # Deployment bucket name. Default is generated by the framework
serverSideEncryption: AES256 # when using server-side encryption
functions:
bar_func:
handler: bar_func.${self:provider.stage}_handler_bar_func
name: ${self:provider.stage}_bar_func
# 以下省略
dev と pro によって、異なる設定が使われているのが分かるかと思います。
デプロイ方法
後は、 sls
コマンドでデプロイするときに、引数で dev と pro を使い分けます。
sls deploy --stage pro # 本番環境へデプロイ
sls deploy --stage dev # 開発環境へデプロイ
その他の話
今回の例のように完全に2つの AWS アカウントに分かれているのであれば割とやりやすいですが、これとは別で(例えばデータ連係先の)第三の AWS アカウントがある場合などは、assume role を使う必要があります。IAM ロールの話は結構ややこしいので、ここでは触れません。本ページ末尾の参考ページを参照して下さい。
まとめ
一般的に、本番環境とそれ以外では AWS アカウントを分けることが推奨されています。 本記事では、 Serverless Framework で、どのように複数の環境を切り替えるかについて、基本的な部分を説明しました。
コメントを残す