web-dev-qa-db-ja.com

AWS Cloudformationでシークレットマネージャーの値を指定する動的参照

とにかく 動的参照Secret Manager にAWS Launch Configユーザーデータに渡すことはできますか?

これが私が試したコードスニペットです:

"SampleLaunchConfig": {
            "Type": "AWS::AutoScaling::LaunchConfiguration",
             "Properties": {
                "ImageId": {
                    "Fn::FindInMap": [
                        "AWSRegionArch2AMI",
                        {
                            "Ref": "AWS::Region"
                        },
                        "AMI"
                    ]
                },
                "UserData": {
                    "Fn::Base64": {
                        "Fn::Join": [
                            "",
                            [
                                "#!/bin/bash -xe\n",
                                "yum update -y\n",
                                "useradd -p <<pwd>>{{resolve:secretsmanager:Credentials:SecretString:userName}}\n",
                                "\n"
                            ]
                        ]
                    }
                }
        }
    }

Useradd:無効なユーザー名「{{resolve:secretsmanager:Credentials:SecretString:userName}}」を取得する際にエラーが発生したようです

Secret Managerのシークレット値をcloudformationユーザーデータに渡すにはどうすればよいですか?

6

なぜこれが正しく展開されないのかわかりません。ただし、パスワードはEC2コンソールに表示されるbase64でエンコードされたユーザーデータスクリプトに埋め込まれるため、CFNがユーザーデータの秘密を拡張することは望ましくありません。

代わりに、ホストで実行するスクリプトがあり、スクリプトの実行時にシークレットマネージャーを呼び出す(テストされていない警告)という事実を利用する必要があります。

"SampleLaunchConfig": {
        "Type": "AWS::AutoScaling::LaunchConfiguration",
         "Properties": {
            "ImageId": {
                "Fn::FindInMap": [
                    "AWSRegionArch2AMI",
                    {
                        "Ref": "AWS::Region"
                    },
                    "AMI"
                ]
            },
            "UserData": {
                "Fn::Base64": {
                    "Fn::Join": [
                        "",
                        [
                            "#!/bin/bash -xe\n",
                            "yum update -y\n",
                            "yum install -y jq\n",
                            !Sub "useradd -p `aws --region ${AWS::Region} secretsmanager get-secret-value --secret-id Credentials --query SecretString --output text | jq -r .passwordKey` `aws --region ${AWS::Region} secretsmanager get-secret-value --secret-id Credentials --query SecretString --output text | jq -r .userName`\n",
                            "\n"
                        ]
                    ]
                }
            }
    }
}

コマンドラインでパスワードを拡張するため、これは理想的ではありません。最初にファイルにパスワードを入れ、そこから読み取ってからファイルを細断処理す​​ることで、より安全になります。

1
JoeB

{{resolve:...}}動的参照は、テンプレート内の特定のコンテキストでのみ展開されるようです。

AWSドキュメントには、テンプレート内のこれらの参照を使用できる正確な場所に関する正確な情報はありません。 {{resolve:secretsmanager:...}}に関する現在の表現は次のとおりです。

「secretsmanager動的参照はすべてのリソースプロパティで使用できます」

ただし、これはあなたの例と矛盾し、動的参照がCloudFormation :: Initデータ内で解決できないことも確認しました。

これについてAWSでアクティブなサポートケースを開いていますが、動的参照の動作が不十分に文書化されていることに同意しています。詳細については、この回答を更新します。

https://docs.aws.Amazon.com/AWSCloudFormation/latest/UserGuide/dynamic-references.html#dynamic-references-secretsmanager

0
direvus