アプリケーションに必要な環境変数は.envファイルで管理されます。
.envファイルは秘匿情報を含むため、gitのリポジトリに置くのは絶対にNGです。gitignoreして管理すればリポジトリにアップロードされることはないですが、どんなミスがあるかわからないので、できれば完全に切り離して管理するのがベターといえます。
そこで本記事では、AWSのSystem Manager(SSM)を利用して、アプリケーションに必要な環境変数を安全に管理する方法について解説します。
目次
前提知識:環境変数と.envファイルについて
環境変数とは
環境変数とは、コンピュータのオペレーティングシステムがプログラムに提供する、環境に関する情報を格納するための変数です。
環境変数には、さまざまな情報が含まれます。たとえば、プログラムの検索パスや言語設定、ユーザー名、ホームディレクトリのパス、システムの一時ファイルディレクトリのパス、データベースの接続情報、APIキーなどです。
環境変数はコマンドラインシェルやプログラムから参照され、変更できます。プログラムは環境変数を参照することで、実行されている環境に応じた動作を行うことが可能です。
たとえば、プログラムがデータベースに接続する必要がある場合、環境変数にデータベースの接続情報を設定しておくことができます。
そうすることで、プログラムが実行される環境が変更された場合でもプログラムのコードを変更することなく、環境に応じた接続情報を使ってデータベースにアクセスできるようになります。
環境変数はオペレーティングシステムやプログラムによって設定されることがありますが、ユーザーが手動で設定することも可能です。
.envファイルとは
.envファイルは、プログラムやアプリケーションが必要とする環境変数を定義するためのファイルです。
環境変数はプログラムが実行される環境に関する情報を格納するために使用されます。たとえば、データベースの接続情報やAPIキーなど、機密性の高い情報を.envファイルに保存できます。
.envファイルは、通常、テキスト形式で作成され、キーと値のペアを含みます。以下に例をあげてみました。
.env
DB_HOST=localhost
DB_USER=myuser
DB_PASSWORD=mypassword
.envファイルは、プログラムやアプリケーションが実行される環境に応じて異なる値を設定できるため、環境の移植性やセキュリティを向上させられます。また、.envファイルを使用すれば、変更が必要な情報がある場合に、プログラムのコードを変更する必要がなくなります。
AWS Systems Manager(SSM)とは
AWS Systems Manager(以下、SSM)は、AWSクラウド上の複数のEC2インスタンスやオンプレミスサーバーを含むハイブリッドクラウド環境で、システム管理タスクを自動化するためのサービスです。
SSMは、以下のような機能を提供しています。
- システム監視
- システム設定管理
- セキュリティ管理
- システム自動化
システムのメトリクスやログを収集し、集約して表示することが可能。また、アラームを設定して、システムに問題が発生した場合に通知できます。
EC2インスタンスやオンプレミスサーバーの設定を一元的に管理できます。設定の一元管理により、設定の整合性を確保し、システムの信頼性を向上させられます。
システムのセキュリティ設定を一元的に管理できます。また、パッチ管理機能を使用して、OSやアプリケーションの脆弱性に対処可能です。
EC2インスタンスやオンプレミスサーバーの設定やアプリケーションのデプロイメントなど、システム管理タスクの自動化が可能です。また、AWS LambdaやAWS Step Functionsなどのサービスと連携して、システム管理タスクをより高度に自動化できます。
このようにSSMは、システム管理に必要な機能を一元的に提供することでシステム管理の効率性を向上させ、システムの信頼性やセキュリティを確保することができます。
SSMの「パラメータストア」を利用して環境変数を安全に管理
環境変数を安全に管理するためには、SSMの機能の一つである「パラメータストア」を利用しましょう。
パラメータストアを利用する最大のメリットは、外部に漏れてはいけない秘匿情報をAWS上で一元管理できる点です。
パラメータストアで環境変数を管理しておけば、開発者はローカルで環境変数を持っておく必要がありません。したがって、誤ってgitリポジトリにアップロードしてしまうなど、開発者から外部に漏れるリスクを抑えられます。
パラメータストアに環境変数を設定する
それでは早速、パラメータストアに環境変数を設定してみます。
AWSのマネジメントコンソールにログインしたら、「パラメータストア」と検索します。
パラメータストアの画面が開いたら、「パラメータの作成」を押下します。サンプルとしてLaravelのAPP_KEYを登録してみます。
- 名前:一意になるようにパスで入力
- 説明:任意だがマネジメントコンソールで検索しやすくするため、名前と同じものを入力しておくと便利
- 利用枠:標準を選択
- タイプ:安全な文字列を選択することで暗号化される
- KMSキーソース:現在のアカウント(デフォルト)
- 値:環境変数の値を入力
ここまで入力したら「パラメータを作成」を押下します。
ECSで環境変数を読み込む
パラメータストアに環境変数を設定できたら、ECSのコンテナから環境変数を読み込めるようにしていきます。
cloudformationから以下のスタックを実行することでECSタスクに環境変数を読み込むことができます。
ECSのタスク実行ロールにSSMの権限を与える
まずはECSのタスク実行ロールにSSMの権限を与えます。
cloudformation.yaml
################################################################
# Resources
################################################################
Resources:
EcsExecutionRole:
Type: AWS::IAM::Role
Properties:
RoleName: !Sub "role-ecs-execution-${AWS::Region}"
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service:
- ecs-tasks.amazonaws.com
Action:
- sts:AssumeRole
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy
- arn:aws:iam::aws:policy/AmazonSSMReadOnlyAccess
################################################################
# Outputs
################################################################
Outputs:
EcsExecutionRole:
Description: ECS execution role
Value: role-ecs-execution
Export:
Name: EcsExecutionRole
続いてECRの設定を行います。
cloudformation.yaml
################################################################
# Resources
################################################################
Resources:
Ecr:
Type: AWS::ECR::Repository
Properties:
RepositoryName: backend-ecr
ImageTagMutability: MUTABLE
ImageScanningConfiguration:
ScanOnPush: true
EcsCluster:
Type: AWS::ECS::Cluster
Properties:
ClusterName: ecs-cluster
Tags:
- Key: Name
Value: ecs-cluster
################################################################
# Outputs
################################################################
Outputs:
EcrBackend:
Description: ECR Backend id
Value: !Ref EcrBackend
Export:
Name: backend-ecr
EcrBackendUri:
Description: ECR Backend uri
Value: !GetAtt EcrBackend.RepositoryUri
Export:
Name: backend-ecr-uri
EcrBackendArn:
Description: ECR Backend arn
Value: !GetAtt EcrBackend.Arn
Export:
Name: backend-ecr-arn
続いて、ECSのタスク定義でSSMに設定した環境変数を読み込みます。
cloudformation.yaml
################################################################
# Resources
################################################################
Resources:
###########################################################
# ECS Task Definition
###########################################################
TaskDefinition:
Type: AWS::ECS::TaskDefinition
Properties:
Family: ecs-task
NetworkMode: awsvpc
RequiresCompatibilities:
- FARGATE
Cpu: 256
Memory: 1GB
RuntimePlatform:
CpuArchitecture: X86_64
OperatingSystemFamily: LINUX
ExecutionRoleArn:
Fn::ImportValue: "EcsExecutionRole"
ContainerDefinitions:
- Name: ecs-container
Image: !Join
- ''
- - Fn::ImportValue: backend-ecr-uri
- ':latest'
Secrets:
- Name: APP_KEY
ValueFrom: !Sub "arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/backend/app-key"
############################################################
# ECS Service
############################################################
EcsServiceBackend:
Type: AWS::ECS::Service
Properties:
ServiceName: !Sub "${ProductEnvironment}-backend-ecs-service"
Cluster:
Fn::ImportValue: ecs-cluster
TaskDefinition: !Ref TaskDefinition
これでAWSの設定は完了です。
タスク起動時に環境変数を読み込む
最後に、タスク起動時に環境変数を読み込むためにひと工夫が必要です。
リポジトリのルートディレクトリに以下のファイルを作成してください。
.env.example
APP_KEY=
entrypoint.shをタスク起動時に実行することで、コンテナ内にSSMから値を取得した環境変数を作成することができます。
entrypoint.sh
#!/bin/sh
set -euC
# Create .env
echo ----- Copy .env file
cp .env.example .env
# update .env
echo ----- Update .env file
sed -i "s@APP_KEY=.*@APP_KEY=${APP_KEY}@g" .env
このような構成にすることによって、開発者が秘匿情報をローカルで抱える必要がなくなり、外部に漏れてしまうリスクも大幅に減少させることができます。
最後にDockerfileに以下の位置文を追加すれば終了です。
CMD ["/bin/sh", "entrypoint.sh"]
さいごに
AWSのSystem Manager(SSM)を利用して、アプリケーションに必要な環境変数を安全に管理する方法について解説しました。
機密性の高い情報を取り扱う際は、漏えいリスクを極力削減することが重要です。今回の記事が管理方法の参考になれば幸いです。
また、LIGブログではアプリ・システム開発やAIなど、テクノロジーに関するお役立ち記事をお届けするメルマガを配信しています。
- <お届けするテーマ>
-
- 開発プロジェクトを円滑に進めるためのTIPS
- エンジニアの生産性が上がった取り組み事例
- 現場メンバーが生成AIを使ってみた
- 開発ツールの使い方や開発事例の解説
- AIをテーマにしたセミナーの案内
- 最新のAI関連ニュースまとめ など
「開発ツールの解説や現場の取り組みを知りたい!」「AIに関する最新情報を集めたい!」とお考えの方は、ぜひお気軽に無料のメルマガをご購読くださいませ。