リモート開発メインのソフトウェア開発企業のエンジニアブログです

Serverless で複数の AWS アカウントを使用する

はじめに

Serverless  Framework とは

本ブログでも過去に何回か紹介した Serverless Framework は、AWS 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 # 開発環境へデプロイ
Moba Pro

その他の話

今回の例のように完全に2つの AWS アカウントに分かれているのであれば割とやりやすいですが、これとは別で(例えばデータ連係先の)第三の AWS アカウントがある場合などは、assume role を使う必要があります。IAM ロールの話は結構ややこしいので、ここでは触れません。本ページ末尾の参考ページを参照して下さい。

まとめ

一般的に、本番環境とそれ以外では AWS アカウントを分けることが推奨されています。 本記事では、 Serverless Framework で、どのように複数の環境を切り替えるかについて、基本的な部分を説明しました。

参考ページ

← 前の投稿

ECSの機能でSSMのParameter Storeに格納した機密情報をTaskDefinitionに埋め込む

次の投稿 →

OpenSSLを使った安全なファイルの転送を検証してみる

コメントを残す