AWS Systems Manager(SSM)で安全に環境変数を管理する方法

AWS Systems Manager(SSM)で安全に環境変数を管理する方法

Yuto Deguchi

Yuto Deguchi

アプリケーションに必要な環境変数は.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は、以下のような機能を提供しています。

  1. システム監視
  2. システムのメトリクスやログを収集し、集約して表示することが可能。また、アラームを設定して、システムに問題が発生した場合に通知できます。

  3. システム設定管理
  4. EC2インスタンスやオンプレミスサーバーの設定を一元的に管理できます。設定の一元管理により、設定の整合性を確保し、システムの信頼性を向上させられます。

  5. セキュリティ管理
  6. システムのセキュリティ設定を一元的に管理できます。また、パッチ管理機能を使用して、OSやアプリケーションの脆弱性に対処可能です。

  7. システム自動化
  8. 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に関する最新情報を集めたい!」とお考えの方は、ぜひお気軽に無料のメルマガをご購読くださいませ。

購読する(無料)

この記事のシェア数

専門学校卒業後、ソフトウェア開発企業にに入社。その後、転職支援サービス会社の社内SEとして従事した後、2022年にLIGへ入社。これまでの経験を活かし、エンジニアの開発ディレクションやシステム設計を担当。現在インフラに挑戦中。

このメンバーの記事をもっと読む
10年以上の開発実績があるLIGが、最適な開発体制や見積もりをご提案します
相談する サービス概要を見る